人们可以这样做:
class master:
@combomethod
def foo(param):
param.bar() # Param could be type as well as object
class slaveClass( master ):
@classmethod
def bar(cls):
print("This is class method")
slaveType = slaveClass
slaveType.foo()
class slaveInstance( master ):
def __init__(self, data):
self.data = data
def bar(self):
print("This is "+self.data+" method")
slaveType = slaveInstance("instance")
slaveType.foo()
combomethod
在“Creating a method that is simultaneously an instance and class method”中定义 .
我的问题是,为什么这样,默认的第一个参数可以't be used as parameter of comboclass? Or at least, why can' t我将对象传递给classmethod作为第一个参数?我知道classmethod和instancemethods之间的区别,我知道装饰器,但我可能不明白如何进行内置的 @classmethod
和 self
参数传递 . 有技术限制吗?或者,为什么 combomethod
还没有内置?
2 回答
combomethod
在访问时不会创建方法对象,而是一个特殊包装的函数 . 与方法类似,每个访问都会创建一个新对象,在本例中是一个新的函数对象 .这是每次访问的新内容:
foo
伪装成真的是_wrapper
:当从类调用时,闭包有obj == None(注意'self'这里指的是combomethod,它在
self.method
中引用了原始函数对象):当作为实例的属性调用时,obj是实例:
这是存储在combomethod中的原始函数:
_wrapper
执行self.method
,将类或实例作为给定obj值的第一个参数:用这个: