1.构造和析构:魔法方法总是被下划线包围例如_init_,其”魔力“体现于总能够在适当的时候被自动调用。 (1)__init__构造函数:初始化或实例化变量
class Rectangle: def __init__(self, x, y): self.x = x self.y = y def getPeri(self): return (self.y + self.x) * 2 def getArea(self): return self.x * self.y rect=Rectangle(3, 4) print(rect.getPeri()) # 14 print(rect.getArea()) # 12此函数返回是None,不可以直接正常使用return返回。
class A: def __init__(self): return 3224 a=A() Traceback (most recent call last): File "C:/Users/TangJingJing/PycharmProjects/untitled1/111.py", line 4, in <module> a=A() TypeError: __init__() should return None, not 'int'(2)new(cls[,…])函数:一般处于__init__函数之前,给返回实例对象一般默认执行,当继承不可变类型时但需要修改时需要重写。
class Capstr(str): def __new__(cls, string): string=string.upper() return str.__new__(cls,string) a=Capstr("asrdtfyguhijk") print(a) ASRDTFYGUHIJK(3)析构函数__del__(self):用于销毁对象
class c: def __init__(self): print("234567") def __del__(self): print('sdfghjk') c1=c() # 234567 c2=c1 del c2 del c1 # sdfghjk2.算术运算:利用__add__(self,other)方法和__sub__(self,other)方法进行加减运算。
class A(int): def __add__(self, other): return int.__add__(self,other) def __sub__(self, other): return int.__sub__(self,other) a=A(4) b=A(5) print(a+b) # 9 class A(int): def __add__(self, other): return int(self)+int(other) def __sub__(self, other): return int(self) - int(other) a=A(4) b=A(5) print(a+b) # 9 class A(int): def __add__(self, other): return self+other def __sub__(self, other): return self-other a=A(4) b=A(5) print(a+b)这个代码运行会报错,因为会进行递归一直执行。 反运算,加上’r’当算术运算由于找不到第一个数的相应运算方法时,系统会自动转为其反运算方法。
class A(int): def __radd__(self, other): return int.__sub__(self,other) a=A(4) b=A(5) print(a+b) # 9 print(1+b) # 4此题开始a可以找到方法A不执行反运算,后面找不到执行反运算b-1.且对象的顺序也是十分重要的。
class A(int): def __rsub__(self, other): return int.__sub__(self,other) a=A(4) print(3-a) # 1 class A(int): def __rsub__(self, other): return int.__sub__(other,self) a=A(4) print(3-a) # -1一元操作符:
一元操作符neg(self)定义正号的行为 :+xpos(self)定义负号的行为 :-xabs(self)定义当被abs()调用的行为invert(self)定义按位求反的行为3.属性访问: (1)getattr(self,name):定义当用户试图获取一个不存在的属性时的行为 (2)getattribute(self,name):定义当该类的属性被访问时的行为 (3)setattr(self,name,value):定义当一个属性被设置时的行为 (4)deltattr(self,name):定义当一个属性被删除时的行为
class C: def __init__(self): self.x='qwer' c=C() print(c.x) # qwer print(getattr(c,'x','没有这个属性')) # qwer print(getattr(c,'y','没有这个属性')) # 没有这个属性 class C: def __getattribute__(self, name): print('getattributa') return super().__getattribute__(name) def __getattr__(self, name): print('getattr') def __setattr__(self, name, value): print('setattr') super().__setattr__(name,value) def __delattr__(self, name): print("delattr") super().__delattr__(name) c=C() c.x c.x=1 print(c.x) del c.x class Rectangle: def __init__(self,width=0,height=0): self.width=width self.height=height def __setattr__(self, name, value): if name=='square': self.width=value self.height=value else: super().__setattr__(name,value) # self.__dict__name=value def getAera(self): return self.width*self.height r1=Rectangle(4,5) print(r1.getAera()) # 204.描述符(Property的原理):将某种特殊类型的类的实例指派给另一个类的属性,其中特殊类型指至少实现以下三种方法中的一个, (1)get(self,instance,owner):用于访问属性,它返回属性的值 (2)set(self,instance,value):将在属性分配操作中调用,不返回任何内容 (3)delete(self,instance):控制删除操作,不返回任何内容
class MyDecriptor: def __get__(self,instance,owner): print("getting...",self,instance,owner) def __set__(self, instance, value): print("setting...",self, instance, value) def __delete__(self, instance): print("deleting...",self, instance) class Test: x=MyDecriptor() test=Test() test.x test test.x='X-man' del test.x getting... <__main__.MyDecriptor object at 0x00000237131A1390> <__main__.Test object at 0x00000237131A1400> <class '__main__.Test'> setting... <__main__.MyDecriptor object at 0x00000237131A1390> <__main__.Test object at 0x00000237131A1400> X-man deleting... <__main__.MyDecriptor object at 0x00000237131A1390> <__main__.Test object at 0x00000237131A1400>