从零开始学Python第七周:面向对象进阶(需修改)
一,类的属性
(1)示例
-
通过属性获取已经创建对象的个数
class Plane: pCount = 0 #类属性 def __init__(self,name,category): self.name = name self.category = category #实例属性 Plane.pCount += 1 print ('已生产,Plane.pCount,'架飞机') p1 = Plane('平安','播音777') print ('已生产',PlanepCount,'架飞机') #输出属性 print ('已生产',p1.pCount,'架飞机') p1.pCount += 1 #变更实例属性值 print('已生产',p1.pCount,'架飞机') print('已生产',Plane.pCount,'架飞机')
(2)属性
-
类属性
@与类绑定,不依赖于对象,又称为静态属性
@不需要实例化对象
@类和其对象都可以访问获取其值 -
实例属性
@存在于对象中
@必须先创建对象,再访问获取其值
@每一个不同的对象都有属于自己的实例属性值
当通过对象访问某个属性时,解释器会先尝试在实例命名空间中寻找。如果找不到,就会去类属性中查找
(3)类属性
-
在类体中声明,并初始化
-
访问方式
@类名.属性
@对象名.属性class Plane: pCount = 0 #声明pCount,并赋初值 def __init__(self): Plane.pCount += 1 #新创建1个对象,其值自增1 print ('已生产,Plane.pCount,'架飞机') p1 = Plane() print ('已生产',PlanepCount,'架飞机') #通过类名获得值 print ('已生产',p1.pCount,'架飞机')
类属性属于类自身,对象仅在没有同名实例属性时才能访问它
类和对象都可以访问类属性,但对象只能读取、不能修改类属性的值
当试图通过对象给类属性赋值时,解释器会理解为:给对象p1的pCount属性赋值
如果对象p1没有pCount属性,会自动的给对象p1创建一个与类属性同名的实例属性
因此,p1.pCount属性与Plane.pCount不是同一属性
(4)实例属性
- 多种声明方式
@_init _()声明,并初始化
@通过赋值语句声明,并赋值
- 对象可以访问类属性,但类不能访问实例属性
(5)获得类属性信息 - 内置函数
@dir():返回类属性列表 - 类的字典属性__dict_ _:返回一个字典
@键是属性名
@值是相应的属性对象的数据值
(6)特殊的类属性 - 每个类都具有内置属性
- 使用点运算符“.”可以访问
- 常用的类属性
(7)特殊的实例属性 - 常用的内置函数
二,类的方法
(1)示例
-
程序中有多条相同的输出语句,代码重复
-
可否提取形成一个新的方法,且调用方法时不依赖类的对象?
(2)方法 -
实例方法:
(self,参数列表)
@与类绑定,依赖对象
@在类中声明定义
@必须先创建对象,再调用执行
@类对象可以调用执行
- 类方法:
@classmethod
类方法(cls,参数列表)
- 静态方法
@与类方法相似
@staticmethod
静态方法名(参数列表)
(3)类方法
- 语法
- 通过装饰器“@classmethod”通知解释器是类方法
- 第1个参数cls表示当前类
- cls是隐含参数,调用方法时不需传入实参
(4)示例1 - 抽取输出代码形成一个类方法
(5)静态方法 - 语法
@staticmethod
静态方法名(参数列表)
- 通过装饰器“@staticmethod”通知解释器是静态方法
- 没有隐含参数
(6)示例2 - 抽取输出代码形成一个静态方法
(7)类方法与静态方法比较 - 相同点
@与类绑定,不依赖于对象
@不需实例化对象
@类和其对象都可以调用执行 - 不同点
**三,类的特殊成员 **
我们都知道类名后边加圆括号调用的是类的init方法:如下
那么,对象后边加括号调用的是什么方法呢?
(1)__call__方法
(2)__str__方法
我们知道当对象实例化以后,通过对象加“.”来调用类的实例属性,那么直接输出对象的话是什么值呢?
一串地址看着太费劲,也看不出来啥东西,一点意义也没有,那么能不能换成别的呢?
(3)__getitem__方法
我们明白了小括号对对象的作用以后,那么我们想一个问题,以前咱们学过的字典取值和列表取值等,列表的名字其实都是一个个的对象,那么后边的中括号又是做什么用的呢?对象+[]又是调用的什么方法呢?
我们应该还记得列表还有一种切片取值的方法,那么这个是怎么实现呢?
(4)__setitem__方法
我们明白了字典列表取值是调用的getitem方法,那么赋值呢?
(5)__delitem__方法
我们记得字典有一个del+对象【】的删除的方式,这个是怎么实现的呢?