1、__new__() //实例化对象调用第一个方法并不是__init__而是__new__,一般Python默认调用,
一般只有在继承了不可变的类要去修改里面内容,需要重写
eg:
class CapStr(str):
def __new__(cls,string):
string = string.upper()
return str.__new__(cls,string)
调用:
cap = CapStr('aa')
print(cap)//AA
2、__init__() //构造方法不能有任何返回
3、__del__() //对象将要被销毁,会自动被调用,跟php中的_destroy ,垃圾回收机制,当所有对象引用都被删除,才会调用
eg:
5、__setattr__()、__getattr()__、__getattribute()__、__delattr__()
__setattr__(): 对象给属性赋值会调用此方法
__getattribute__():读取对象属性调用此方法(不管属性是否存在都会调用)
__getattr__():对象属性不存在才会调用,此方法在__getattribute__()之后调用
__delattr__():删除一个对象的属性,调用此方法
6、描述符__get__ 、__set__、__delete__
实例一:
实例二:
eg:
class CapStr(str):
def __new__(cls,string):
string = string.upper()
return str.__new__(cls,string)
调用:
cap = CapStr('aa')
print(cap)//AA
2、__init__() //构造方法不能有任何返回
3、__del__() //对象将要被销毁,会自动被调用,跟php中的_destroy ,垃圾回收机制,当所有对象引用都被删除,才会调用
eg:
class YO:
def __init__(self):
print('111')
def __del__(self):
print('22')
调用:
yo = YO()
yo1 = yo
del yo //此时不会调用__del__
del yo1 //两个都删掉才会调用__del__ 22
调用:
yo = YO()
yo1 = yo
del yo //此时不会调用__del__
del yo1 //两个都删掉才会调用__del__ 22
4、算数运算
4.1 正向运算
class New_int(int): def __add__(self, other): return int.__sub__(self,other) def __sub__(self, other): return int.__add__(self, other) a = New_int(2) b = New_int(3) print(a+b) # -1 print(a-b) # 5
4.2 逆向运算
class New_int(int): def __radd__(self, other): return int.__sub__(self,other) a = 3 b = New_int(2) print(a+b) #-1,因为3不是New_int,找不到,就会执行b的逆向运算radd,self是b,other是a
5、__setattr__()、__getattr()__、__getattribute()__、__delattr__()
__setattr__(): 对象给属性赋值会调用此方法
__getattribute__():读取对象属性调用此方法(不管属性是否存在都会调用)
__getattr__():对象属性不存在才会调用,此方法在__getattribute__()之后调用
__delattr__():删除一个对象的属性,调用此方法
class MyTime:
def __setattr__(self,name,val):
print('setattr')
return super().__setattr__(name,val)
def __getattribute__(self,name):
print('getattribute')
return super().__getattribute__(name)
def __getattr__(self,name):
print('getattr')
def __delattr__(self,name):
print('delattr')
return super().__delattr__(name)
m = MyTime()
m.a
m.a = 2
m.a
del m.a
6、描述符__get__ 、__set__、__delete__
实例一:
class MyProperty:
def __init__(self,fget=None,fset=None,fdel=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
def __set__(self,instance,val):
self.fset(instance,val)
def __get__(self,instance,owener):
return self.fget(instance)
def __delete__(self,instance):
self.fdel(instance)
class C:
def __init__(self):
self._x = 0
def getContent(self):
return self._x
def setContent(self,val):
self._x = val
def delContent(self):
del self._x
x = MyProperty(getContent,setContent,delContent)
c = C()
print(c.x)
c.x = 11
print(c.x)
实例二:
class A:
def __init__(self,value=0):
self.value = value
def __set__(self,instance,val):
self.value = val
def __get__(self,instance,owener):
return self.value
class B:
def __init__(self,value=0):
self.value = value
def __set__(self,instance,val):
instance.a = val + 1
def __get__(self,instance,owener):
return instance.a
class C:
a = A()
b = B()
c = C()
print(c.a)
c.a = 11
print(c.a)
c.b = 10
print(c.a)
print(c.b)
class Test:
def __init__(self,*args):
self.values = [x for x in args]
self.count = {}.fromkeys(range(len(self.values)),0)
def __len__(self):
return len(self.count)
def __getitem__(self,key):
self.count[key] += 1
return self.values[key]
t = Test(1,2,3,4,5,6)
print(t[1])
print(t[2])
print(t[1])
print(t.count)