前言
前面我们已经介绍了 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入门篇之面向对象的使用技巧和注意事项,需要的朋友参考一下 面向对象设计与面向对象编程的关系 面向对象设计(OOD)不会特别要求面向对象编程语言。事实上,OOD 可以由纯结构化语言来实现,比如 C,但如果想要构造具备对象性质和特点的数据类型,就需要在程序上作更多的努力。当一门语言内建 OO 特性,OO 编程开发就会更加方便高效。另一方
面向对象三要素:封装、继承、多态 封装:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口。 继承: 继承基类的方法,并做出自己的扩展; 声明某个子类兼容于某基类(或者说,接口上完全兼容于基类),外部调用者可无需关注其差别(内部机制会自动把请求派发dispatch到合适的逻辑)。 多态:基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。很显然,多态实际上是依附
本文向大家介绍Python面向对象基础入门之编码细节与注意事项,包括了Python面向对象基础入门之编码细节与注意事项的使用技巧和注意事项,需要的朋友参考一下 前言 在前面,我用了3篇文章解释python的面向对象: 面向对象:从代码复用开始 面向对象:设置对象属性 类和对象的名称空间 本篇是第4篇,用一个完整的示例来解释面向对象的一些细节。 例子的模型是父类Employe和子类Manager,从
面向对象的基本特征 面向对象的三个基本特征是:封装、继承、多态 封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 继承 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派
本文向大家介绍python学习之面向对象【入门初级篇】,包括了python学习之面向对象【入门初级篇】的使用技巧和注意事项,需要的朋友参考一下 前言 最近在学习Python的面向对象编程,以前是没有接触过其它的面向对象编程的语言,因此学习这一部分是相当带劲的,这里也总结一下。 概述 python支持多种编程范式:面向过程、面向对象、面向切面(装饰器部分)等。 面向过程:根据业务逻辑从上到下写垒代码
谢谢逆水寒龙,topmad和Liqing纠错 Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程。 面向对象的最主要目的是提高程序的重复使用性。我们这么早切入面向对象编程的原因是,Python的整个概念是基于对象的。了解OOP是进一步学习Python的关键。 下面是对面向对象的一种理解,基于分类。 相近对