python中的双下滑线方法
len(a) len(对象) 如果此类中有__len__ 就_方法会自动执行__len__
# len(a) len(对象) 如果此类中有__len__ 就_方法会自动执行__len__ class A: def __init__(self, name, age): self.name = name self.age = age self.sex = '男' def __len__(self): # print(666) return len(self.__dict__) a = A('barry', 18) print(len(a))
__call__方法 对象() 触发 __call__方法使得对象具备当作函数来调用的能力
class Foo: def __init__(self): print(11) def __call__(self, *args, **kwargs): print(65656) pass obj = Foo() obj() # 对象() 触发 __call__方法 class PenFactory: def __init__(self, p_type): self.p_type = p_type def __call__(self, p_color): print('创建一个%s这个类型的画笔,它的颜色是%s' % (self.p_type, p_color)) # gangbiF = PenFactory('钢笔') # gangbiF('红色') # gangbiF('蓝色') # gangbiF('黑色') qianbiF = PenFactory('铅笔') qianbiF('红色') qianbiF('蓝色') qianbiF('黑色')
__new__ 构造方法
1, 类名() 执行object.__new__方法,开辟的对象空间并返回
2,自动执行__init__方法,将空间创给self
3,在__init__给对象封装属性。
应用场景举例单例模式https://www.cnblogs.com/chen55555/p/10289777.html
class A: def __init__(self,name): self.name = name print('in A __init__') def __new__(cls, *args, **kwargs): print('in A __new__') return object.__new__(cls) a = A('rock') print(a.name)
item系列将对象视为字典使用时,就会触发item方法
# item系列将对象视为字典使用时,就会触发item方法 class Foo: def __init__(self,name): self.name = name def __getitem__(self, item): # print(666) print('obj[key]把对象当字典用时执行') return self.name # print(self.__dict__[item]) def __setitem__(self, key, value): # print(key) # print(value) print('obj[key] = value设置字典的键值时执行') self.__dict__[key] = value # def __delitem__(self, key): # print('del obj[key]时,我执行') # self.__dict__.pop(key) # def __delattr__(self, item): # print('del obj.key时,我执行') # self.__dict__.pop(item) f1 = Foo('sb') ret = f1['name'] print(ret) f1['age'] = 12 print(f1.__dict__) print(f1.age) f1['age'] = 18 f1['age1'] = 19 del f1.age1 del f1['age'] f1['name'] = 'alex' print(f1.__dict__)
__str__ print(obj)是调用__str__方法
可以格式化打印对象中的信息
class Penson: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return '这个人的姓名是%s,年龄是%s' % (self.name, self.age) p1 = Penson('rock', 18) print(p1, type(p1)) p2 = Penson('张三', 20) print(p2) s = str(p1) print(s, type(s))
__repr__
当实现了__str__方法可用repr来获取函数地址 当没有实现了__str__方法则执行类中的__repr__
class Penson: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return '这个人的姓名是%s,年龄是%s' % (self.name, self.age) def __repr__(self): return 'repr' p1 = Penson('rock', 18) print(p1, type(p1)) p2 = Penson('张三', 20) print(p2) # s = str(p1) # print(s, type(s)) # 当实现了__str__方法可用repr来获取函数地址 # 当没有实现了__str__方法则执行类中的__repr__ print(repr(p1))

浙公网安备 33010602011771号