python 【面向对象程序设计】
✔类的所有实例方法都至少有一个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)