我以前创建了一个Python类,它看起来像这样:
class Foo:
@classmethod
def bar(cls, x):
print(x + 3)
Foo.bar(7) # prints '10'
现在我想用某种状态来改造这个接口,这样调用者就可以创建一个Foo
对象,给它一些属性,然后调用它的bar()
方法,它可以访问self
及其属性:
不幸的是,这打破了之前的接口-Foo.bar(7)
现在将给出TypeError: bar() missing 1 required positional argument: 'x'
,因为{
我可以添加一个@classmethod
装饰器来实现这一点:
class Foo:
def __init__(self, y=3):
self.y = y
@classmethod
def bar(cls, x):
self = cls()
print(x + self.y)
Foo.bar(7) # prints '10'
Foo().bar(7) # prints '10'
Foo(20).bar(7) # prints '10', but I want '27'
是否可以创建一个@flexmethod
装饰器来转换另一个方向?特别是-如果作为实例方法调用,如Foo(20).bar(...)
,则什么都不做;如果作为类方法调用,如Foo.bar(...)
,则创建一个新的Foo
对象(不使用参数构造函数),并将其作为self
参数传递。在
我本来打算通过查看@classmethod
的源代码来尝试这一点,但它看起来好像是在C级别实现的。在
Descriptor HOWTO有完整的章节介绍}如何工作,以及如何在它们上实现变体,包括这个与
@classmethod
和{classmethod
等效的纯Python:如果你不清楚它是如何工作的,你可能需要阅读整个HOWTO。我有一个a blog post,它试图首先介绍与方法相关的内容,这可能有助于克服HOWTO第一部分的抽象障碍。在
相关问题 更多 >
编程相关推荐