标签:name family 对象 elf pre 执行顺序 call 意义 情况
1.内置方法表示:__名字__
几种名称: 1)双下方法 2)魔术方法 3)类中的特殊方法/内置方法
类中的每一个双下方法都有它自己的特殊意义;所有的双下方法没有 需要你在外部直接调用的
父类Object都带有这些方法,而总是有一些其他的 内置函数 特殊语法来触发双下方法
2.__call__()方法:
class A: def __call__(self, *args, **kwargs): print(‘对象()自动触发我!‘) a = A() a() #这两个步骤还可以写为A()()
1)__call__的一些用法,如果你有两个类,你只想显给别人B类,而不暴露A类,可能在实例化A类之前做一些事情
这时候就需要引入另一个类,让它执行__call__方法
class A: def __call__(self, *args, **kwargs): print(‘执行call方法了‘) class B: def __init__(self,cls): print(‘在实例化A之前做一些事情‘) self.a = cls() #实例化A的对象 self.a() #调用A类中的call方法 print(‘在实例化A之后做一些事情‘) B(A) #只暴露B,不暴露A
2)__len__方法:
a:遇到len(obj)会自动触发obj的__len__方法
class A: def __init__(self,obj): self.obj = obj def __len__(self): return len(self.obj) a = A(‘wwwwww‘) print(len(a)) #结果为6
3)__str__方法:
a:会自动触发该方法的几种情况
1)print一个对象相当于调用一个对象的__str__方法
2)str(obj),相当于执行obj.__str__方法
3)‘%s‘ % obj相当于执行了obj.__str__方法
b:如果类中没有__str__方法,会自动执行父类的Object的__str__方法,但是只会返回给你一个内存地址,因为它不知道你想要得到什么属性;
class A: pass a = A() print(a) #输出结果: <__main__.A object at 0x0000024F722690F0> #类中含有__str__方法: class A: def __str__(self): return (‘%s, %s, %s‘)% (self.name,self.age,self.cls) def __init__(self,name): self.name = name self.age = 15 self.cls = ‘python‘ a = A(‘zhou‘) print(a) b = A(‘liu‘) print(b) #输出结果 zhou, 15, python liu, 15, python
c:有什么用处,特别好用能不用你调用就自动输出一些你需要显示的内容;
4)__new__方法:
a:__new__和__init__的千丝万缕
__new__:开辟内存空间,属于对象的,把对象的空间作为返回值传给self,执行init方法; 类的构造方法
__init__:给对象封装属性; 类的初始化方法
看他们的执行顺序:
class A: def __new__(cls, *args, **kwargs): print(‘执行了__new__方法‘) return object.__new__(cls) def __init__(self): print(‘执行了__init__方法‘) a = A() #执行结果 执行了__new__方法 执行了__init__方法
#所以__new__是在对象实例化之前调用的,还没有开辟空间传给self,所以这里会把cls类的空间传进来;
new的金典题目单例类:
单例类:在实例化对象后,每个对象的开辟的空间一样,就是单例类;
class A: _NAME = None def __new__(cls, *args, **kwargs): if not cls._NAME: cls._NAME = object.__new__(cls) return cls._NAME def __init__(self): pass a = A() print(a) b = A() print(b) #输出结果 <__main__.A object at 0x00000221704E9240> <__main__.A object at 0x00000221704E9240>
标签:name family 对象 elf pre 执行顺序 call 意义 情况
原文地址:https://www.cnblogs.com/0627zhou/p/9416230.html