python: в методе родительского класса вызовите метод класса этого класса, но связанный с дочерним классом - PullRequest
2 голосов
/ 23 сентября 2011

Скажем, у меня есть следующий код:

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__ мне нужно вызвать 'foo', который определен в Parent, но мне нужно назвать его привязанным к Child, чтобыcls.classattr1 фактически получит доступ к атрибуту, поскольку он переопределяется в Child.Есть идеи как это сделать?

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Вот вариант:

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 голосов
/ 23 сентября 2011

Вам действительно нужно 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 голосов
/ 23 сентября 2011

Это должно сработать:

Parent.foo.im_func(Child)

, но выглядит немного злым

...