Как ссылаться на переопределенные функции класса в Python - PullRequest
2 голосов
/ 09 августа 2011

Я знаю C ++ и Java, и я не знаком с Pythonic программированием. Так что, может быть, это плохой стиль в том, что я пытаюсь сделать.

Рассмотрим следующий пример:

class foo:
        def a():
                __class__.b() # gives: this is foo
                bar.b() # gives: this is bar
                foo.b() # gives: this is foo
                # b() I'd like to get "this is bar" automatically

        def b():
                print("this is foo")

class bar( foo ):
        def b( ):
                print("this is bar")

bar.a()

Обратите внимание, что я не использую параметры self, так как я не пытаюсь создавать экземпляры классов, поскольку в моей задаче нет необходимости. Я просто пытаюсь ссылаться на функцию так, чтобы она могла быть переопределена.

Ответы [ 2 ]

5 голосов
/ 09 августа 2011

То, что вы хотите, чтобы a был классным методом.

class Foo(object):
    @classmethod
    def a(cls):
        Foo.b() # gives: this is foo
        Bar.b() # gives: this is bar
        cls.b() # gives: this is bar
    @staticmethod
    def b():
        print("this is foo")

class Bar(Foo):
    @staticmethod
    def b():
        print("this is bar")

Bar.a()

Я отредактировал ваш стиль, чтобы он соответствовал стилю кодирования Python . Используйте 4 пробела в качестве отступа. Не ставьте лишние пробелы между скобками. Заглавные буквы и имена классов CamelCase.

A staticmethod - это метод класса, который не принимает аргументов и не воздействует на атрибуты класса. classmethod - это метод класса, который автоматически получает класс в качестве атрибута.

Вы успешно использовали наследство.

0 голосов
/ 09 августа 2011

Цитата из Модель исполнения :

Область имен, определенных в блоке класса, ограничена классом блок; это не распространяется на блоки кода методов - это включает в себя выражения генератора, так как они реализованы с использованием область действия функции.

Это означает, что в области действия функции a нет имени b. Вы должны ссылаться на него через объект класса или экземпляра.

...