day20_3 内置方法

内置方法:

  __名字__

  他的表述有多种:
类中的特殊方法\内置方法
双下方法
魔术方法 magic_method
类中的每一个双下方法都有它自己的特殊意义
__call__   相当于   对象()
__len__          len(obj)
__new__   特别重要 开辟内存空间的 类的构造方法


__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 = A()
        self.a()      #self.a() ==> A()() ===》相当于执行CALL方法
        print('在实例化A之后做一些事情')
        
        
a = A()
a()          # 对象() == 相当于调用__call__方法
# a.call()     
B(A)

实例化对象a ,再加个()就相当于调用__call__方法 

对象 =类名()()也是同理   (

相当于先实例化得到一个对象,再对对象(),==>和上面的结果一样,相当于调用__call__方法

__len__
 其实内置函数和类的内置方法是由奸情的
len(dict)  /tuple、str、list、set   这些类型都可以计算长度

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))
# len(obj)相当于调用了这个obj的__len__方法
# __len__方法return的值就是len函数的返回值
# 如果一个obj对象没有__len__方法,那么len函数会报错


class My:
    def __init__(self, s):
        self.s = s

    def __len__(self):
        return len(self.s)

    
my = My('abc')
print(len(my))        # 3
__new__
相当于 构造方法
__init__ 
相当于  初始化方法
class Single:
    def __new__(cls, *args, **kwargs):
        # print('在new方法里')
        obj = object.__new__(cls)
        print('在new方法里',obj)
        return obj

    def __init__(self):
        print('在init方法里',self)
1.开辟一个空间,属于对象的
2.把对象的空间传给self,执行init
3.将这个对象的空间返回给调用者
 
obj = Single()
假如single的new,single没有,只能调用object的new方法
new方法在什么时候执行???
在实例化之后,__init__之前先执行new来创建一块空间
 
单例
  如果一个类 从头到尾只能有一个实例,说明从头到尾之开辟了一块儿属于对象的空间,那么这个类就是一个单例类

class A:pass

a = A()
a2 = A()
a3 = A()
print(a,a2,a3)   #我们实例化三个对象,并不是单例

那如何才能实现单例呢?

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
        print(self)


s1 = Single('alex',83)
s2 = Single('taibai',40)

print(s1.name)
print(s2.name)
print(s1,s2)       #你会发现s1 = s2 实现了单例类
__str__

l = [1,2,3]  # 实例化一个list的对象
# 其实l就是一个对象
print(l)
class Student:
    def __str__(self):
        return '%s %s %s' % (self.school,self.cls,self.name)  # 设置返回的信息

    def __init__(self,name,stu_cls):
        self.school = 'zcdx'
        self.name = name
        self.cls = stu_cls


he = Student('zxd', 'tongxin1')
# print(he)
she = Student('cyy', 'wuliu1')
# print(she)
# print(str(he))   # 内置的数据类型,内置的类,相当于执行__str__
print('学生1 : %s' % he)
 

猜你喜欢

转载自www.cnblogs.com/zhuangdd/p/12505493.html