面向对象--内置方法

__名字__
     类中的特殊方法内置方法
双下方法
魔术方法 magic_method
类中的每一个双下方法都有它自己的特殊意义

1.__call__ 相当于 对象()
class A:
    def __call__(self, *args, **kwargs):
        print('执行call方法了')
a = A()
a()  # 对象() == 相当于调用__call__方法
A()()#相当于先实例化得到一个对象,再对对象(),==>和上面的结果一样,相当于调用__call__方法
结果:
执行call方法了
执行call方法了

class A:
    def __call__(self, *args, **kwargs):
        print('执行call方法了')
    def call(self):
        print('执行call方法了')
class B:
    def __init__(self,cls):
        print('在实例化A之前做一些事情')
        self.a = cls()
        self.a()
        print('在实例化A之后做一些事情')
B(A)
在实例化A之前做一些事情
执行call方法了
在实例化A之后做一些事情

 

2.__len__  相当于len(obj)

内置函数和类的内置方法是有联系的
class mylist:
    def __init__(self):
        self.lst = [1,2,3,4,5,6]
        self.name = 'alex'
        self.age = 83
    def __len__(self):
        print('执行__len__了')
        return len(self.__dict__)
l = mylist()
print(len(l))

结果:3

class mylist:
    def __init__(self):
        self.lst = [1,2,3,4,5,6]
        self.name = 'alex'
        self.age = 83
    def __len__(self):
        print('执行__len__了')
        return len(self.lst)
l = mylist()
print(len(l))

结果:6
 len(obj)相当于调用了这个obj的__len__方法
__len__方法return的值就是len函数的返回值
如果一个obj对象没有__len__方法,那么len函数会报错
3.__new__  特别重要   开辟内存空间的 类的构造方法
 单例类
class Single:
    __ISINCTANCE = None
    def __new__(cls, *args, **kwargs):
        if not cls.__ISINCTANCE:
            cls.__ISINCTANCE = object.__new__(cls)
        return cls.__ISINCTANCE
    def __init__(self,name,age):
        self.name = name
        self.age = age

s1 = Single('aaaa',83)
s2 = Single('bbbb',40)
print(s1.name)
print(s2.name)
结果:
bbbb
bbbb

4.__str__  str(obj), '%s'  %  obj,  print(obj)

class Student:
    def __str__(self):
        return '%s %s %s'%(self.school,self.cls,self.name)
    def __init__(self,name,stu_cls):
        self.school = 'oldboy'
        self.name = name
        self.cls = stu_cls
a = Student('asd','55')
print(a)
q = Student('qwe','66')
print(q)
print(str(a))   # 内置的数据类型,内置的类,相当于执行__str__
print('学生1 : %s'%a)

oldboy 55 asd
oldboy 66 qwe
oldboy 55 asd
学生1 : oldboy 55 asd
 
 
 
原文地址:https://www.cnblogs.com/chenyibai/p/9392953.html