python内置函数:__call__ __len__ __new__ __str__

一、__call__方法:

class A:
    def __call__(self,*args,**kwargs):
        print(print('执行了call方法了'))
class B:
    def __init__(self, cls):
        self.a = cls()
        self.a()
# a = A()
# a() #  相当于执行了call方法
# a2= A()()
# a2 #  相当于执行了call方法

B(A) #  相当于执行了call方法,并且可以再执行call方法之前或者之后做某事

二、__len__方法

class mylist:
    def __init__(self):
        self.lst = [1,2,5]
    def __len__(self):
        print('执行了__len__了')
        return len(self.lst)
l = mylist()
print(len(l))
# len(obj)相当于这个obj的__len__方法
# __len__方法return的值就是len函数的返回值
# 如果一个obj对象没有__len__方法,那么len函数会报错

class str_len:
    def __init__(self, str):
        self.str = str
    def __len__(self):
        return len(self.str)
l = str_len('12345679')
print(len(l))

三、__new__方法

在开辟一个空间的时候,__init__之前执行__new__方法

class Single:
    def __new__(cls, *args, **kwargs):
        print('在new方法里面', )
        return object.__new__(cls)
    def __init__(self):
        print('init')
Single()
class Single:
    def __new__(cls, *args, **kwargs):
        obj = object.__new__(cls)
        print('在new方法里面', obj)
        return obj
    def __init__(self):
        print('init', self)
Single()

 单例类:整个类只能实例化一个对象(只开辟一个空间)

#  单例类:整个类只能实例化一个对象(只开辟一个空间)
class Single:
    __ISIN = None
    def __new__(cls, *args, **kwargs):
        if not cls.__ISIN:
            cls.__ISIN = object.__new__(cls)
        return cls.__ISIN
    def __init__(self, name, age):
        self.name = name
        self.age = age
s1 = Single('Alex', 20)
print(s1)
s2 = Single('wusir', 40)
print(s2)
print(s1.name)
print(s2.name)

四、__str__方法

打印(print)对象的时候会运行__str__方法
class Student:
    def __str__(self):  # 打印(print)对象的时候会运行__str__方法
        return '%s %s'%(self.name, self.stu_cls)
    def __init__(self, name, stu_cls):
        self.stu_cls = stu_cls
        self.name = name
s1 = Student('heziwei', 15)
print(s1)
s2 = Student('huangdongmei', 16)
print(s2)
print(str(s1))  #  相当于执行__str__方法

 

上一篇:ecshop订单状态对应值详解


下一篇:mysql命令行清屏