2011-09-23 67 views
2

說我有下面的代碼:蟒蛇:在父類的方法,調用這個類的類方法,但綁定到一個子類

class Parent(object): 
    classattr1 = 'parent' 
    def __init__(self): 
     Parent.foo() 

    @classmethod 
    def foo(cls): 
     print cls.classattr1 

class Child(Parent): 
    classattr1 = 'child' 

    def foo(cls): 
     raise Exception("I shouldn't be here") 

Child() 

Parent.__init__,我需要調用「富」是中定義Parent,但我需要將它綁定到Child,以便訪問cls.classattr1實際上將訪問該屬性,因爲它在Child中被重寫。任何想法如何做到這一點?

回答

0

這應該工作:

Parent.foo.im_func(Child) 

但看起來有點邪。

0

您確實需要foo才能成爲classmethod?如果沒有,這個工程:

class Parent(object): 
    classattr1 = 'parent' 
    def __init__(self): 
     Parent.foo(self) 

    def foo(self): 
     print self.classattr1 

class Child(Parent): 
    classattr1 = 'child' 
    def foo(self): 
     raise AttributeError("Wrong foo!") 

Child() # prints 'child' 
+0

不幸的是,子類還需要實現自己的'foo',所以我不能這樣做。事實上,這會更容易。 – Tommy

+0

所以兩者都有不同的'foo's,但是當父類代碼正在運行時,它需要訪問它自己的'foo'而不是孩子的'foo'?但父母'foo'應該使用孩子的屬性? –

+1

爲什麼他們需要'classmethod's?如果他們不這樣做,則更新後的代碼有效。 –

1

這裏有一個選項:

class Parent(object): 
    classattr1 = 'parent' 
    def __init__(self): 
     Parent.foo(self) 

    def foo(self): 
     print self.classattr1  # or self.__class__.classattr1 

class Child(Parent): 
    classattr1 = 'child' 
    def foo(cls): 
     raise Exception("I shouldn't be here") 

Child() 

Parent.foo()不是一個類的方法了,但最終的結果應該是一樣的,你想要什麼。

>>> c = Child() # prints 'child' by calling Parent.foo() 
child 
>>> c.foo()  # Child.foo() raises an exception 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in foo 
Exception: I shouldn't be here 
+0

如果我們都來到相同的代碼,它一定是對的! :) –