2017-05-30 113 views
1

如何從子類訪問靜態函數。Python3:從子類訪問靜態函數

class Parent: 
    bar = [] 

    @classmethod 
    def foo(cls): 
    print(' | '.join(cls.bar)) 

class Child_A(Parent): 
    bar = ['abs', 'arq', 'agf'] 
    foo() # ERROR: NameError: name 'foo' is not defined 
### abs | arq | agf 

class Child_B(Parent): 
    bar = ['baz', 'bux', 'bet'] 
    foo() # ERROR: NameError: name 'foo' is not defined 

### baz | bux | bet 

class Child_C(Parent): 
    bar = ['cat', 'cqy', 'cos'] 
    foo() # ERROR: NameError: name 'foo' is not defined 

### cat | cqy | cos 

每個孩子都有自己的一套bar名單,我想他們使用foo()功能從父類打印出正確的字符串。

+1

你有一個類的方法。只需使用父對象而無需實例化。 'Parent.foo()' – Kasramvd

+0

'Parent.foo()'返回'Parent.bar',而不是'Child.bar'。 – MakPo

+1

如果這是你想要的,請完全在你的問題中解釋它。 – Kasramvd

回答

1
class Parent: 
    bar = [] 
    @classmethod 
    def foo(cls): 
     print(' | '.join(cls.bar)) 

class Child(Parent): 
    bar = ['baz', 'qux', 'far'] 
Child.foo() 

類方法是一種方法綁定到一個類而不是它的對象。它不需要創建類實例。 Classmethod將始終返回同一類而不是子類的實例。其實classmethod將打破OOP的規則。

1

類方法是使用類名

在你的子類foo的方法

所以繼承訪問,但你有一個類名來稱呼它

class Parent: 
    bar = [] 
    @classmethod 
    def foo(cls): 
     print(' | '.join(cls.bar)) 

class Child(Parent): 
    bar = ['baz', 'qux', 'far'] 
    Child.foo() # This will make cls Child class and access child's bar element 
### baz | qux | far 
+0

我試過了。我收到一個不同的錯誤,說'NameError:name''Child'沒有被定義 – MakPo