python学习之魔术方法day10/下午

魔术方法
__del__方法
class A():
    count=0
    def __init__(self,name):
        self.name=name
        A.count+=1
    def __del__(self):
        print("删除",self.name,"还剩%d个对象"%(A.count))
        A.count-=1
a=A("张三")
b=A("李四")
print(a.name)
print(b.name)
"""
张三
李四
删除 张三 还剩2个对象
删除 李四 还剩1个对象
"""

#在外部执行完del之后就不能调出a,b的属性了
del a
del b
print(a.name)
print(b.name)
 

__add__,__sub__,__mul__,__call__方法

class A():
    def __init__(self,n):
        self.n=n

    def __add__(self, other):
        return self.n+other.n

    def __sub__(self,other):
        return self.n-other.n

    def __mul__(self, other):
        return self.n*other.n

    def __call__(self,num):
        return self.n*num
a=A(8)     #传入第一个参数
b=A(4)     #传入第二个参数
c=a*b      #32    第一个参数和第二个参数加减乘除
print(c)

__call__  调用
class A():
    def __init__(self,n):
        self.n=n
    def __call__(self, *args, **kwargs):
        result=self.n
        for a in args:
            result*=a
        for k,v in kwargs.items():
            result +=v
        return result
a=A(5)
c=a(1,2,3,age=4,shegao=5)
print(c)

__new__  方法生成对象
class Car():
    def __new__(cls, *args, **kwargs):   #函数执行时先生成一个新的对象,然后再进行初始化
        print("我在这儿")
        return object.__new__(Car)
    def __init__(self,name,cid):
        print("你好")
        self.name=name
        self.cid =cid
c=Car("bmw","京A88888")

hasattr   判断类是否有某个属性
class Car():
    obj=""
    def __new__(cls, *args, **kwargs):   #函数执行时先生成一个新的对象,然后再进行初始化
        print("我在这儿")
        return object.__new__(Car)
    def __init__(self,name,cid):
        print("你好")
        self.name=name
        self.cid =cid
c=Car("bmw","京A88888")
print(hasattr(c,"obj"))        #True  判断对象c是否有obj属性
print(hasattr(c,"xx"))         #False 判断对象c是否有xx属性

class Car():
    def __new__(cls, *args, **kwargs):
        if not hasattr(Car,"inst"):
            Car.inst=object.__new__(Car)
        return Car.inst

    def __init__(self,name,cid):
        print("你好")
        self.name=name
        self.cid=cid

a=Car("bmw","京A88888")
b=Car("宝马","京B88888")
print(a is b)            #不仅比较内容也比较地址
print(a.name,a.cid)      #宝马 京B88888
print(a.name,a.cid)      #宝马 京B88888

猜你喜欢

转载自blog.csdn.net/qq_39112101/article/details/88066205
今日推荐