【问题标题】:How to "hide" superclass methods in a subclass如何在子类中“隐藏”超类方法
【发布时间】:2011-08-15 04:45:21
【问题描述】:

我基本上想创建一个“隐藏”超类上的方法的子类,这样它们就不会出现在 dir()hasattr() 调用中,并且用户不能调用它们(至少不能通过任何的正常渠道)。我也想用尽可能少的“魔法”来做到这一点。谢谢。

【问题讨论】:

  • “不能打电话给他们”?这不是和“没有用处”一样吗?还是和“引发异常”一样?
  • 它是我正在使用的自制数据库 ORM 的一部分。自动生成的 python 对象允许访问修改所有数据库字段,但我希望对某些字段有更多控制权,并且不允许用户修改它们。

标签: python attributes properties subclass


【解决方案1】:

分别覆盖__dir____getattribute__ 方法应该可以解决问题。这几乎是在 Python 中执行此类操作的规范方式。虽然你是否应该这样做完全是另一回事。

请参阅Customizing Attribute Access 上的 Python 文档

使用__dir__ 列出可用属性(这不会影响实际的属性访问)

class A(object):
    def __dir__(self):
        return []

>>> print dir(A())
[]

使用__getattribute__控制实际属性访问

class A(object):
    def __getattribute__(self, attr):
        """Prevent 'private' attribute access"""
        if attr.startswith('_'):
            raise AttributeError

        return object.__getattribute__(self, attr)


>>> a = A()
>>> a.x = 5
>>> a.x
5
>>> a._x = 3
>>> a._x
AttributeError

这可能是你想要做的。

class NoSuper(object):
    def __getattribute__(self, attr):
        """Prevent accessing inherited attributes"""
        for base in self.__bases__:
            if hasattr(base, attr):
                raise AttributeError

        return object.__getattribute__(self, attr)

【讨论】:

  • 谢谢。虽然 __dir__ 方法技巧似乎不起作用。
  • __dir__ 方法应该只返回属性列表,它实际上并不控制对象属性访问。用一个例子更新了我的答案。
  • 啊,dir方法只有python2.6+。
【解决方案2】:

你不应该继承,你应该使用组合。将您的其他类实例包装在一个新的类实例中并根据需要使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 2014-12-01
    • 2011-11-17
    • 1970-01-01
    • 2016-04-13
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多