我有两个方法,一个用于单个Instance,另一个用于该类中的每个Instance:
class MasterMatches(models.Model):
@classmethod
def update_url_if_any_matches_has_one(cls):
# apply to all instances, call instance method.
def update_url_if_any_matches_has_one(self):
# do something
我应该将它们命名为相同吗?或者,这里有什么好的命名约定?
答案 0 :(得分:0)
通过了解装饰器的工作原理,可以澄清使用相同名称的问题。
@dec
def foo(x):
print(x)
转换为
def foo(x):
print(x)
foo = dec(foo)
在您的示例中,装饰器语法可以扩展为
class MasterMatches(models.Model):
def update_url_if_any_matches_has_one(cls):
# apply to all instances, call instance method.
update_url_if_any_matches_has_one = classmethod(update_url_if_any_matches_has_one)
def update_url_if_any_matches_has_one(self):
# do something
update_url_if_any_matches_has_one
的前一个实现将被后者覆盖。
答案 1 :(得分:-1)
通常使用自我声明风格。 @classmethod仅在方法不适用于类实例字段时使用。
作为@classmethod修饰的函数接受第一个参数是类类型,而普通方法接受对象的实例。
class A:
@classmethod
def a(cls):
print(cls)
def b(self):
print(self)
a = A()
a.a()
a.b()
# Output:
# <class '__main__.A'>
# <__main__.A object at 0x03FC5DF0>
如果您有静态类字段,它会很有用。要访问therm,您不需要显式指定类名。但是您无法访问实例字段。例如:
class A:
field = 1
@classmethod
def a(cls):
print(cls.field)
def b(self):
self.field = 2
print(self.field, A.field)
a = A()
a.a()
a.b()
# Outputs:
# 1
# 2 1