2015-03-13 151 views
1

命名約定我有兩種方法,一種爲單獨的實例,以及一個用於在該類的每個實例:類方法VS實例方法

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

不要將它們命名爲相同的,因爲它們會覆蓋另一個。 – Ffisegydd 2015-03-13 19:39:35

+1

而且不要將它們命名爲那麼長。 – 2015-03-13 19:52:52

+1

我只是在classmethod中更具描述性。類似'update_all_master_matches_instance_urls'來確保調用者知道該操作適用於所有實例,而不僅僅是被調用的實例。 – tdelaney 2015-03-13 20:21:15

回答

-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 
+2

這真的不回答問題 – Dannnno 2015-03-13 20:01:53

+0

爲什麼不回答?在許多情況下,使用自我聲明風格,如果不需要訪問類實例字段並需要訪問類靜態字段,請使用@classmethod – vladkens 2015-03-13 20:39:36

+0

問題是關於命名約定。你解釋了它們是如何工作的(而且也很淺薄,imo) – Dannnno 2015-03-13 20:41:05

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前實施,將通過後者被覆蓋。