永远爱学习

导航

Python描述器 怎么做 之 自定义classmethod装饰器


# 描述符是干什么的: 描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中);
# 还有描述器一般结合着装饰器来使用。描述符是可以实现大部分python类特性中的底层魔法,包括@classmethod,@staticmethd,@property
# 甚至是__slots__属性,描述父是很多高级库和框架的重要工具之一,描述符通常是使用到装饰器或者元类的大型框架中的一个组件.





# 例2 :利用描述符原理完成一个自定制@classmethod
class ClassMethod:
def __init__(self, func):
self.func = func

def __get__(self, instance, owner): # 类来调用,instance为None,owner为类本身,实例来调用,instance为实例,owner为类本身,
def feedback():
print('在这里可以加功能啊...')
return self.func(owner)
return feedback


class People:
name = 'linhaifeng'

@ClassMethod # say_hi=ClassMethod(say_hi)
def say_hi(cls):
print('你好啊,帅哥 %s' % cls.name)


People.say_hi()
p1 = People()
p1.say_hi()


# 疑问,类方法如果有参数呢,好说,好说
class ClassMethod:

def __init__(self, func):
self.func = func

def __get__(self, instance, owner): # 类来调用,instance为None,owner为类本身,实例来调用,instance为实例,owner为类本身,
def feedback(*args, **kwargs):
print('在这里可以加功能啊...')
return self.func(owner, *args, **kwargs)
return feedback


class People:
name = 'linhaifeng'

@ClassMethod # say_hi=ClassMethod(say_hi)
def say_hi(cls, msg):
print('你好啊,帅哥 %s %s' % (cls.name, msg))


People.say_hi('你是那偷心的贼')
p1 = People()
p1.say_hi('你是那偷心的贼')

posted on 2018-10-19 09:39  永远爱学习  阅读(273)  评论(0)    收藏  举报