类方法与实例方法的命名约定

时间:2015-03-13 19:37:25

标签: python

我有两个方法,一个用于单个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

我应该将它们命名为相同吗?或者,这里有什么好的命名约定?

2 个答案:

答案 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