如何在python中引用重写类函数

时间:2011-08-09 09:35:00

标签: python oop inheritance class-method static-functions

我了解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 个答案:

答案 0 :(得分:5)

你想要的是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 coding style。使用4个空格作为缩进。不要在括号之间加上额外的空格。资本化& CamelCase类名。

staticmethod是一个类上的方法,它不接受任何参数,也不对该类的属性起作用。 classmethod是类的一种方法,它将类作为属性自动获取。

你继承的使用很好。

答案 1 :(得分:0)

来自Execution Model

的引用
  

类块中定义的名称范围仅限于该类   块;它没有扩展到方法的代码块 - 这个   包括生成器表达式,因为它们是使用   功能范围。

这意味着函数b的范围内没有名称a。您应该通过类或实例对象引用它。