Python之面向对象进阶知识
1. 反射
a. python面向对象中的反射:对象用字符串形式操作去实现对象的相关属性,把一个字符串数据类型的变量变成一个真实存在在程序中的变量名,并且能够使用它。
b. 四个函数
*. getattr(对象,字符串类型的方法或属性):方法得到的是方法的地址,属性拿到的是值。等价于对象/类.属性/方法。getattr是反射中最常用的方法。
*. hasattr:查看对象是否有某种属性或方法
*. setattr:给对象设置属性或方法
*. delattr:删除对象的属性或方法
class Person: def __init__(self,name): self.name = name def happy(self): print("%s is happy"%self.name) pe = Person("pe") func = getattr(pe,"happy") # 相当于jh.happy() func() # hasattr(对象,要去调用的属性或方法)--判断是否有这个属性 if hasattr(pe,"sleep"): func = getattr(pe,"sleep") func() # 不常用--setattr() 设置属性 setattr(pe,"sex","female") # 添加属性 print(pe.sex) def sleep(self): # 添加方法,必须要传一个参数,非常不常用,一般不用 print("%s is sleep"%self.name) setattr(pe,"sleep",sleep) pe.sleep(pe) # delatter--删一个属性 delattr(对象,属性名) delattr(pe,"sleep") #删除属性 print(pe.sleep) # 报错
2. 类的内置方法
a. __str__和__repr__
*. %s 和 __str__ 一样,%r 和 __repr__ 一样
*. __repr__是__str__的备胎,可以替代__str__,但__str__不能替代__repr__,在只能实现一个方法是优先实现__repr__
b. __del__ 析构方法:在程序执行完成后,自动执行。主动触发,立马执行,和del一样
c. __call__:对象()--自动触发
d. __eq__:== 自动触发
e. __hash__:hash 自动触发
f. item:都是用 对象[] 去触发
*. __getitem__:调用属性或方法
*. __setitem__:创建属性或方法
*. __delitem__:删除属性或方法
g. __new__:创造对象self,在类里边默认先执行__new__方法
class A: def __new__(cls, *args, **kwargs): pass def __init__(self): pass
3. 单例模式:实例始终只有一个,它的属性随设置而改变
class Teacher: __isinatance = None def __new__(cls, *args, **kwargs): if not cls.__isinatance: cls.__isinatance = object.__new__(cls) return cls.__isinatance def __init__(self,name,cloth): self.name = name self.cloth = cloth liu = Teacher("liu","1") liu2 = Teacher("liu","2") liu3 = Teacher("liu","3") print(liu) print(liu2) print(liu3)