Python面向对象基础入门之设置对象属性


Posted in Python onDecember 11, 2018

前言

前面我们已经介绍了 python面向对象入门教程之从代码复用开始(一) ,这篇文章主要介绍的是关于Python面向对象之设置对象属性的相关内容,下面话不多说了,来一起看看详细的介绍吧

用类存储数据

类实际上就是一个数据结构,对于python而言,它是一个类似于字典的结构。当根据类创建了对象之后,这个对象就有了一个数据结构,包含一些赋值了的属性。在这一点上,它和其它语言的struct的作用是类似的:存储数据并提供数据检索功能

例如,下面是史上最简单的类:

class Person: pass

pass关键字表示这个类没有实际的逻辑体。这里只是定义了一个类,这个类的对象初始化时不会存放任何数据。现在,构造一个对象,让它和dict一样存放一些数据:

p = Person() # 构造对象
p.name = "longshuai" # 创建对象的属性name
p.age = 23   # 创建对象的属性age

现在,Person的实例对象p中就存放了两个属性:p.name和p.age。可以直接去检索存放在p中的数据:

print(p.name) # 输出"longshuai"
print(p.age) # 输出23

也可以使用dict来存储这些数据:

>>> d={}
>>> d["name"]="longshuai"
>>> d["age"]=23

>>> print(d["name"])
longshuai
>>> print(d["age"])
23

在数据存储方面,它们的作用是完全等价的。实际上对象/类在内部就是使用一个名为__dict__的dict类型来存放它所拥有的数据的。

>>> p.__dict__
{'name': 'longshuai', 'age': 23}

__init__()构造对象初始数据

上面的name和age属性是在构建了对象之后附加上去的,如果想要创建对象时就存放好数据,可以定义类的构造函数__init__()。例如:

class Person:
 def __init__(self,name,age):
  self.name = name
  self.age = age

然后创建对象的时候,传递name参数和age参数即可。

>>> p = Person("longshuai",23)
>>> p.__dict__
{'name': 'longshuai', 'age': 23}

如果想定义这个类公有的数据,可以将公有属性定义为类的属性。比如中国人都是黄皮肤:

class Person:
 skin = "yellow"
 def __init__(self,name,age):
  self.name = name
  self.age = age

这样每次创建Person的对象实例时,每个对象都会有相同的肤色:yellow。但注意,这个skin属性是类属性,不是对象属性,它是存放在类的名称空间中的。当对象真的需要这个属性的时候,会临时去检索类的名称空间来获取。看下面的__dict__字典即可知道:

>>> p = Person("longshuai",23)
>>> p.__dict__
{'name': 'longshuai', 'age': 23}
>>> p.skin
'yellow'

但注意,按照面向对象的封装原则,在类中定义类变量属性是不合理的,因为要在外部访问它需要通过x.y的方式,这意味着打开了封装好的"黑匣子",暴露了属性。除非真的有需要,否则可以将类变量的定义放进构造函数__init__()中,这样每个初始化的对象都会有该属性。

setter和getter方法

在面向对象的角度上考虑,一般是不建议直接在类的外部通过x.name的方式赋值、取值的。而是定义对应的方法,通过方法来取得对应的值。这两类方法称为setter、getter方法:setter用于赋值或设置属性值,getter用于取得属性值。

class Person:
 skin = "yellow"
 def __init__(self,name,age):
  self.name = name
  self.age = age
 def set(self,job):
  self.job = job
  return self
 def get(self):
  return self.name,self.age,self.job

上面的set方法用于设置一个新属性job。get用于返回对象的3个属性。

>>> p = Person("longshuai",23)
>>> p.set("manager")
>>> name, age, job = p.get()
>>> print([name,age,job])
['longshuai', 23, 'manager']

需要注意,setter方法可以有多种类型的返回值,常用的有4种:

  • 返回设置后的值
  • 返回设置前的值
  • 返回对象自身
  • 返回布尔值,表示是否设置成功

这4种返回值都很常见,特别是第三种用来串联对象方法的时候非常好用。修改上面的set方法:

class Person:
 skin = "yellow"
 def __init__(self,name,age):
  self.name = name
  self.age = age
 def set(self,job):
  self.job = job
  return self
 def get(self):
  return self.name,self.age,self.job

上面的set()返回self对象自身。于是串联set()和get():

>>> p = Person("longshuai",23)
>>> name,age,job = p.set("manager").get()

无论使用何种返回值方式,都不会真正影响程序的使用。但使用合理的返回值类型,可能会简化代码的编写。另外,决定了返回值的方式后,就不要再去修改,因为很可能会牵一发而动全身。

上面的getter返回了多个值,但一般来说getter只返回一个对应的属性。比如getname()返回name属性,getage()返回age属性等。这样需要定义多个getter方法。

def get_name(self):
 return self.name

def get_age(self):
 return self.age

def get_job(self):
 return self.job

合并setter和getter

很多时候可以合并setter和getter方法。合并的方式是判断方法的参数,如果调用方法的时候给了参数,就表示setter,没有给定参数,就表示是getter。

例如,对于job属性:

def set_get_job(self, job=None):
 if job:
  self.job = job
 else:
  return self.job

现在可以以给参数和不给参数两种不同的方式来调用set_get_job()方法:

p = Person("longshuai", 23)
p.set_get_job("manager")  # 给了参数,说明是setter
job = p.set_get_job()  # 没给参数,说明是getter

总结

本文介绍了各种设置对象属性的方式,属性其实就是数据,对象/类就是属性的容器,这一点很重要。我最开始学java的面向对象时,虽然对类和对象有那些教科书式的理解,但始终没有感受到类/对象其实就是一种用来存储数据的数据结构。直到学习了Python/Perl,我才意识到这一点,然后理解面向对象就容易的多了。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python编程中的文件操作攻略
Oct 16 Python
使用Python来开发Markdown脚本扩展的实例分享
Mar 04 Python
老生常谈python函数参数的区别(必看篇)
May 29 Python
python如何去除字符串中不想要的字符
Jul 05 Python
Python3.x爬虫下载网页图片的实例讲解
May 22 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
浅谈Python traceback的优雅处理
Aug 31 Python
使用python对文件中的单词进行提取的方法示例
Dec 21 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
Jun 24 Python
Python中BeautifuSoup库的用法使用详解
Nov 15 Python
python中watchdog文件监控与检测上传功能
Oct 30 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
python提取包含关键字的整行数据方法
Dec 11 #Python
django开发post接口简单案例,获取参数值的方法
Dec 11 #Python
python面向对象入门教程之从代码复用开始(一)
Dec 11 #Python
python 运用Django 开发后台接口的实例
Dec 11 #Python
IntelliJ IDEA安装运行python插件方法
Dec 10 #Python
Python文件如何引入?详解引入Python文件步骤
Dec 10 #Python
python的继承知识点总结
Dec 10 #Python
You might like
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
php中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
基于PHP文件操作的详解
2013/06/05 PHP
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
Python版的文曲星猜数字游戏代码
2013/09/02 Python
Python写的贪吃蛇游戏例子
2014/06/16 Python
python脚本实现查找webshell的方法
2014/07/31 Python
Python脚本实现代码行数统计代码分享
2015/03/10 Python
Python实现查找系统盘中需要找的字符
2015/07/14 Python
让python在hadoop上跑起来
2016/01/27 Python
怎样使用Python脚本日志功能
2016/08/14 Python
使用python实现个性化词云的方法
2017/06/16 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
pygame实现简易飞机大战
2018/09/11 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
Python实现手绘图效果实例分享
2020/07/22 Python
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
优质服务演讲稿
2014/05/14 职场文书
事业单位考核材料
2014/05/21 职场文书
毕业典礼主持词
2015/06/29 职场文书
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python