【问题标题】:How to refer overriden class functions in python如何在python中引用覆盖的类函数
【发布时间】:2011-08-09 09:35:00
【问题描述】:

我知道 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 参数,因为我没有尝试创建类的实例,因为我的任务不需要。我只是想以一种可以覆盖该函数的方式引用一个函数。

【问题讨论】:

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


    【解决方案1】:

    你想要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 是类上的一个方法,它自动获取类作为属性。

    您对继承的使用很好。

    【讨论】:

    【解决方案2】:

    引用自Execution Model

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

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

    【讨论】:

    • 他不知道该怎么做,但仍然允许它被覆盖——这是他的问题。
    • @agf 我相信他想知道为什么会这样。
    猜你喜欢
    • 2020-04-10
    • 2011-01-29
    • 2022-11-03
    • 1970-01-01
    • 2019-06-19
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多