魔法方法总结

一、__call__方法

class A():
    def __call__(self, *args, **kwargs):
        print("我的名字叫做中南毛毛虫")

# 于是便可以进行以下的操作:
mkc = A()
mkc()
A()()

二、__len__方法

class Class():
    def __init__(self, name):
        self.name = name
        self.student = []
    def __len__(self):
        return len(self.student)

py2020 = Class('python_2020')
print(len(py2020)) #0
py2020.student.append('messi')
print(len(py2020)) #1
py2020.student.append('mkc')
print(len(py2020)) #2

三、__new__方法
作用:实例化时,开辟对象的内存空间,重新__new__方法,可以实现例如:单例模式

class Person():
    flag = None
    def __new__(cls, *args, **kwargs):
        print("重写子类的__new__方法")
        if cls.flag == None:
            cls.flag = super().__new__(cls)
        return cls.flag

    def __init__(self, name, birth):
        self.name = name
        self.birth = birth


p1 = Person('mkc', 1993)
print(p1.name) #mkc
p2 = Person('xyy', 1994)
print(p1.name) #xyy
print(p2.name) #xyy

四、__str__方法

class Person():
    def __init__(self, name, birth):
        self.name = name
        self.birth = birth
    # 只能返回str类型数据
    def __str__(self):
        return f'此人的名字为{self.name},生日为{self.birth}'

p1 = Person('messi', 1987)
# 运用场景一:直接打印对象
print(p1)
# 运用场景二:运用在%s拼接
print("刚刚创建了一个Person对象,%s"%(p1))
# 运用场景二:运用在str(p1)
print(str(p1))

五、__eq__方法、__lt__方法、__gt__方法
重写=、>、<的魔法方法

import time

class Person():
    def __init__(self, name, birth):
        self.name = name
        self.birth = birth
    @property
    def age(self):
        return time.localtime().tm_year - self.birth

    def __eq__(self, other):
        return self.name==other.name and self.age == other.age

    def __lt__(self, other):
        return self.age > other

    def __gt__(self, other):
        return self.age < other

p1 = Person('mkc', 1994)
p2 = Person('mkc', 1990)
p3 = Person('mkc', 1994)
p4 = Person('xyy', 1993)
print(p1 == p2)
print(p1 == p3)
print(p1 > p2)
print(p1 < p2)
posted @ 2020-11-16 16:48  中南毛毛虫  阅读(96)  评论(0编辑  收藏  举报