标签:优先 Owner 代理 构造函数 其他 let __init__ 字符串 直接
# 当继承一个不可变类型时,又需要的时候使用
# 需求:输入字符串,输出的是大写的字符串
class CapStr(str):
def __new__(cls,string):
string = string.upper()
return str.__new__(cls, string) # 调用父类new返回
a = CapStr("i love you")
print(a) # 输出 I LOVE YOU
# __del__(self)
class C:
def __init__(self):
print("我是init,我被执行了")
def __del__(self):
print("我是del,我被执行了")
c1 = C() # 执行后,打印 我是init,我被执行了
c2 = c1 # 无打印
c3 = c2
del c3 # 无打印输出
del c2 # 无打印输出
del c1 # 执行后打印,我是del,我被执行了
class Cat:
def __init__(self, new_name, new_age):
self.name = new_name
self.age = new_age
def __str__(self):
"""自定义 返回一个对象的描述信息"""
# print(num)
return "名字是:%s , 年龄是:%d" % (self.name, self.age)
c1 = Cat("Tom", 8)
print(c1) # 打印:名字是:Tom , 年龄是:8
class A:
def __init__(self, name):
self.name = name
def __str__(self):
return "name:%s,----->from str" % self.name
def __repr__(self):
return "name:%s,----->from repr" % self.name
a1 = A("jack")
a2 = A("cindy")
print(a1) # name:jack,----->from str
p = [a1, a2]
print(p)
# [name:jack,----->from repr, name:cindy,----->from repr]
# 当__repr__注释掉时,仅使用__str__时,打印的是地址
demo:
class C:
def __getattribute__(self, name):
print("getattribute")
super().__getattribute__(name) # 调用基类的该方法
# return self.name 会无限循环
def __getattr__(self, name):
print("getattr")
def __setattr__(self, name, value):
print("setattr")
super().__setattr__(name, value)
# self.name = value 会无限循环
def __delattr__(self, name):
print("delattr")
super().__delattr__(name)
# del self.name 会无限循环
c = C()
print(c.x) # 打印 getattributr/getattr
c.x = 10 # 打印 setattr
print(c.x) # 打印 getattribute
del c.x # 打印 delattr
注意:所有的属性方法,注意无限循环
item 系列以字典的形式访问属性时被调用
以字典key的方式访问是否存在的属性时,都会触发__getitem__,这一点有别于__getattr__
class Foo:
def __init__(self, a):
self.a = a
def __getitem__(self, item):
print("__getitem__被触发了")
def __getattr__(self, item):
print("__getattr__被触发了")
f = Foo("word")
f["a"]
f["b"]
#output:
__getitem__被触发了
__getitem__被触发了
使用[]设置实例属性时 ,触发__setitem__
class Foo:
def __setitem__(self, key, value):
print("__setitem__被触发了")
def __setattr__(self, key, value):
print("__setattr__被触发了")
f = Foo()
f.x = 10
f["y"] = 10
#output:
__setattr__被触发了
__setitem__被触发了
使用[]删除实例属性时 ,触发__delitem__
class Foo:
def __init__(self, a, b):
self.a = a
self.b = b
def __delitem__(self, key):
print("__delitem__被触发了")
def __delattr__(self, key):
print("__delattr__被触发了")
f = Foo("one", "two")
del f.a
del f["b"]
#output:
__delattr__被触发了
__delitem__被触发了
描述符是什么:
描述符干什么:
调用属性时,触发__get__()
**为属性赋值时,触发、__set__()**
采用del删除属性时,触发 __delete__()
定义一个描述符:下面这个新式类就是描述符
class Foo:
def __get__(self, instance, owner):
print("我是get...")
def __set__(self,instance, value):
print("我是set...")
def __delete__(self, instance):
print("我是delete...")
描述符类实例化的对象,进行属性操作并不会触发这三个方法的执行
描述符分两种:
描述符严格遵循优先级,优先级由高到低分别是:
标签:优先 Owner 代理 构造函数 其他 let __init__ 字符串 直接
原文地址:https://www.cnblogs.com/liuxu2019/p/12115951.html