微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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__方法

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐