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 # sdfghjk
2.算术运算:利用__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) | 定义正号的行为 :+x |
pos(self) | 定义负号的行为 :-x |
abs(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()) # 20
4.描述符(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>