要想改变我们的人生,第一步就是要改变我们的心态。只要心态是正确的,我们的世界就会的光明的!

总结:
- Python的方法(包括staticmethod()和classmethod())都实现为非数据描述器
Python中的描述器应用
描述器在Python中应用非常广泛。
Python的方法(包括staticmethod()和classmethod())都实现为非数据描述器。因此,实例可以重新定义和覆盖方法。这允许单个实例获取与同一类的其他实例不同的行为。
property()函数实现为一个数据描述器。因此,实例不能覆盖属性的行为。
class A:
@classmethod
def foo(cls): # 非数据描述器
pass
@staticmethod # 非数据描述器
def bar():
pass
@property # 数据描述器
def z(self):
return 5
def getfoo(self): # 非数据描述器
return self.foo
def __init__(self): # 非数据描述器
self.foo = 100
self.bar = 200
#self.z = 300
a = A()
print(a.__dict__)
print(A.__dict__)
#------------------------------------------------------------------------
{'foo': 100, 'bar': 200}
{'__module__': '__main__', 'foo': <classmethod object at 0x0000029A69A676D8>, 'bar': <staticmethod object at 0x0000029A69A67A58>, 'z': <property object at 0x0000029A69A07638>, 'getfoo': <function A.getfoo at 0x0000029A69965E18>, '__init__': <function A.__init__ at 0x0000029A69970598>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
练习
- 实现StaticMethod装饰器,完成staticmethod装饰器的功能;
- 实现ClassMethod装饰器,完成classmethod装饰器的功能
# 类staticmethod装饰器;
class StaticMethod: # 怕冲突改名
def __init__(self, fn):
self._fn = fn
def __get__(self, instance, owner):
return self._fn
class A:
@StaticMethod
# stmtd = StaticMethod(stmtd)
def stmtd():
print('static method')
A.stmtd()
A().stmtd()
# 类classmethod装饰器
class ClassMethod: # 怕冲突改名
def __init__(self, fn):
self._fn = fn
def __get__(self, instance, owner):
ret = self._fn(owner)
return ret
class A:
@ClassMethod
# clsmtd = ClassMethod(clsmtd)
# 调用A.clsmtd() 或者 A().clsmtd()
def clsmtd(cls):
print(cls.__name__)
print(A.__dict__)
A.clsmtd
A.clsmtd()
3、对实例的数据进行校验
class Person:
def __init__(self, name:str, age:int):
self.name = name
self.age = age
对上面的类的实例的属性name、age进行数据校验(思路)
- 写函数,在_init_ 中先检查,如果不合格,直接抛异常
- 装饰器,使用inspect模块完成
- 描述器
class Person:
def __init__(self, name:str, age:int):
params = ((name, str),(age, int))
if not self.checkdata(params):
raise TypeError()
self.name = name
self.age = age
def checkdata(self, params):
for p, t in params:
if not isinstance(p, t):
return False
return True
p = Person('tom','18')
#---------------------------------------
TypeError:
网友评论