✔类的所有实例方法都至少有一个self参数,且 self 必须是方法的第一个参数(如果有多个参数的话),self 代表将来要创建的对象本身。
■在Python,将实例方法的第一个参数定义为 self 只是一个习惯。实际上,不是一定要用 self 来表示将来创建的对象,可以自己取定。
1 class Dog: 2 def __init__(nself,name): 3 nself.name=name; 4 def info(self): 5 print(self.name) 6 7 d=Dog("大黄") 8 d.info()
✔类的属性有两类:实例属性、类属性。实例属性(也称:静态属性)是在构造方法__init__中定义的,因为实例属性是在对象创建时才会分配空间,所以定义和类内使用都要以self或类名为前缀,类外使用以对象名为前缀。类属性(也称:对象属性)是定义在所有方法之外的,类内使用以self或类名为前缀,类外使用以对象名或类名为前缀。
■在Python中比较特殊的是,可以在类和对象都创建完成后,动态向类中增加新的属性和方法,俗称混入(mixin)机制。 这就是Python的动态性。 如何增加呢?增加新的属性:对象名 . 新属性=value。增加新方法:import types 对象名 . 新方法名 = types . MethodType(新方法名,对象名)
car1 = Car("Red") #实例化对象 car2 = Car("Blue") print(car1.color, Car.price) #查看实例属性和类属性的值 Car.price = 110000 #修改类属性 Car.name = 'QQ' #动态增加类属性 car1.color = "Yellow" #修改实例属性 print(car2.color, Car.price, Car.name) print(car1.color, Car.price, Car.name)
✔静态方法
① 用@staticmethod修饰器修饰
②=“ 定义在类中的全局函数”
③可以无参数,若有参数,不会将第一个参数看做调用对象。
④调用方式为:a.)类名.静态方法名 b.) 对象名.静态方法名
类方法
①用@classmethod装饰器修饰,第一个参数cls是当前类。
②调用方式为:a.)类名.静态方法名 b.) 对象名.静态方法名
✔定义时,有“__”前缀的成员是私有成员。在类内以“self.__”的形式调用,类外则无法直接访问,但可以通过[1]公有成员方法和[2]Python特殊方式间接访问。
E: [1] def info(self,value) [2] 对象名 . _类名__私有成员
return self.__value a._A__value
而定义时,无下划线前缀的成员是公有成员。在类内以“self.__”的形式调用,类外以“对象名 . 成员名”的形式访问。
✔私有方法和公有方法的定义与相应成员的定义相似。
■在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其是在类的定义中。用下划线作为变量名和方法名前缀和后缀来表示类的特殊成员:
_xxx:受保护成员,不能用'from module import *'导入;
__xxx__:系统定义的特殊成员; 定制类???
__xxx:私有成员
✔@property,property意思是“属性”,功能是代替set、get方法。
E:
1 class B: 2 def __init__(self,atr): 3 self.__atr=atr 4 5 @property #代替getAtr方法 6 def atr(self): 7 print("property输出装饰器被调用") 8 return self.__atr 9 10 @atr.setter #代替setAtr方法 11 def atr(self,newAtr): 12 self.__atr=newAtr 13 14 if __name__=="__main__": 15 b=B("20") 16 17 print(b.atr) 18 """ atr为私有属性,无法在类外直接访问,但第15行语句能执行 19 通过输出语句“property输出装饰器被调用”可知是property的作用效果 20 """ 21 b.atr=30 22 print(b.atr) 23 print(b._B__atr)