是否有必要在定义时装饰类方法?
Is it neccessary to decorate a classmethod at it's definition?
在Python的OOP概念中一共有三种方法——实例方法、class方法和静态方法。
class MyClass:
def instancemethod(self):
return 'instance method called'
@classmethod
def classmethod(cls):
return 'class method called'
@staticmethod
def staticmethod():
return 'static method called'
三个方法都知道是显而易见的。现在我在 class:
中创建了一个新方法
class Test():
def ppr():
print('what method is ppr?')
不是实例方法。
inst = Test()
inst.ppr()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ppr() takes 0 positional arguments but 1 was given
所以这是一个class方法?
Test.ppr()
what method is ppr?
没有 @classmethod
关键字来修饰 ppr
函数。
让我们测试一下:
class MyClass:
def instancemethod(self):
return 'instance method called'
@classmethod
def classmethod(cls):
return 'class method called'
@staticmethod
def staticmethod():
return 'static method called'
class Test():
def ppr():
print('what method is ppr?')
print(type(MyClass.instancemethod)) # -> function
print(type(MyClass.classmethod)) # -> method
print(type(MyClass.staticmethod)) # -> function
print(type(Test.ppr)) # -> function
因为 Test.ppr
作为 函数 返回并且它可以是 运行 而无需创建实例 - 它是 @staticmethod
。
如果它是 @classmethod
- 它会返回类型 method.
q.e.d.
我的 IDE 向我显示警告:'Method ppr has no argument.' 提示您可能应该添加 self
或 cls
以及相应的 @classmethod
回答您的问题 - 似乎不需要(此时) - 但谨慎声明它们 @staticmethod
以明确您的意图。
对于普通的静态方法,它可以被class或实例调用。
#called by class
MyClass.staticmethod()
'static method called'
#called by instance
MyClass().staticmethod()
'static method called'
Test
class中的方法是非标准的static method
。
Test.ppr()
what method is ppr?
Test().ppr()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ppr() takes 0 positional arguments but 1 was given
在Python的OOP概念中一共有三种方法——实例方法、class方法和静态方法。
class MyClass:
def instancemethod(self):
return 'instance method called'
@classmethod
def classmethod(cls):
return 'class method called'
@staticmethod
def staticmethod():
return 'static method called'
三个方法都知道是显而易见的。现在我在 class:
中创建了一个新方法class Test():
def ppr():
print('what method is ppr?')
不是实例方法。
inst = Test()
inst.ppr()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ppr() takes 0 positional arguments but 1 was given
所以这是一个class方法?
Test.ppr()
what method is ppr?
没有 @classmethod
关键字来修饰 ppr
函数。
让我们测试一下:
class MyClass:
def instancemethod(self):
return 'instance method called'
@classmethod
def classmethod(cls):
return 'class method called'
@staticmethod
def staticmethod():
return 'static method called'
class Test():
def ppr():
print('what method is ppr?')
print(type(MyClass.instancemethod)) # -> function
print(type(MyClass.classmethod)) # -> method
print(type(MyClass.staticmethod)) # -> function
print(type(Test.ppr)) # -> function
因为 Test.ppr
作为 函数 返回并且它可以是 运行 而无需创建实例 - 它是 @staticmethod
。
如果它是 @classmethod
- 它会返回类型 method.
q.e.d.
我的 IDE 向我显示警告:'Method ppr has no argument.' 提示您可能应该添加 self
或 cls
以及相应的 @classmethod
回答您的问题 - 似乎不需要(此时) - 但谨慎声明它们 @staticmethod
以明确您的意图。
对于普通的静态方法,它可以被class或实例调用。
#called by class
MyClass.staticmethod()
'static method called'
#called by instance
MyClass().staticmethod()
'static method called'
Test
class中的方法是非标准的static method
。
Test.ppr()
what method is ppr?
Test().ppr()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ppr() takes 0 positional arguments but 1 was given