【问题标题】:How can I override class attribute access in python?如何在 python 中覆盖类属性访问?
【发布时间】:2012-03-22 10:20:38
【问题描述】:

如何在 python 中覆盖类属性访问?

附:有没有办法单独保留对类属性的常规访问,但在缺少属性时调用更具体的异常?

【问题讨论】:

    标签: python attributes


    【解决方案1】:

    当实例/类/父类上不存在该属性时,会调用__getattr__ 魔术方法。您可以使用它为缺少的属性引发特殊异常:

    class Foo:
        def __getattr__(self, attr):
            # only called when self.attr doesn't exist
            raise MyCustonException(attr)
    

    如果要自定义访问类属性,需要在元类/类型上定义__getattr__:

    class BooType(type):
        def __getattr__(self, attr):
            print attr
            return attr
    
    class Boo(metaclass=BooType):
        pass
    
    boo = Boo()
    Boo.asd # prints asd
    boo.asd # raises an AttributeError like normal
    

    如果要自定义all属性访问,请使用__getattribute__魔术方法。

    【讨论】:

    • 那不是修改实例不是类属性访问吗?
    • "如果要自定义所有属性访问,请使用 getattribute 魔术方法。"具有误导性:引用另一个问题的评论:“getattribute 仅在实例属性访问时调用 - 如果您希望在类属性访问时调用它,它需要在元类上。”
    • 正如@run_the_race 所说。见docs.python.org/3/reference/…
    • 注意:class Boo(object): 代码不适用于 Python3,请使用 class Boo(metaclass=BooType): pass
    • @SarahMesser 已更新。
    【解决方案2】:

    agf's answer 是正确的,事实上我即将给出的答案是基于它并且欠它一些功劳。

    只是为了提供更多关于类属性方面的详细信息,这是此处实际存在问题的部分(与 __getattr__ 和 __getattribute__ 之间的区别相反),我想添加对 @ 的引用987654322@,其中更详细地介绍了类和实例属性之间的区别、如何实现以及为什么需要使用元类来影响类属性查找。

    【讨论】:

    • 嘿,你对另一个问题的回答很好,但这并不是这个问题的真正答案。您应该在此处添加一些内容,或者将其发布为对问题或我的回答的评论。
    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 2016-07-20
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2022-01-19
    • 2014-04-30
    相关资源
    最近更新 更多