1

所以我有一个 .py 文件,其中包含一个可以作为属性访问其子类的类。所有这些子类都是预先定义的。我还需要所有子类都具有相同的能力(让它们自己的子类可以作为属性访问)。我一直面临的最大问题是我不知道如何在我的实现中访问当前类__getattr__(),所以这是一个很好的起点。

这是我迄今为止尝试过的一些 Python+伪代码。我很确定它不会起作用,因为它__getattr__()似乎只适用于类的实例。如果是这种情况,对不起,我对 Python 中的 OOP 并不像我希望的那样熟悉。

class A(object):
    def __getattr__(self, name):
        subclasses = [c.__name__ for c in current_class.__subclasses__()]
        if name in subclasses:
            return name
    raise AttributeError
4

3 回答 3

2
    class A(object):
        def __getattr__(self, key):
            for subclass in self.__class__.__subclasses__():
                if (subclass.__name__ == key):
                    return subclass
            raise AttributeError, key

出于好奇,这是为了什么而设计的?

于 2012-08-08T04:26:12.140 回答
2

如果我正确理解了您的问题,您可以通过使用将 a 添加classmethod到其实例的自定义元类来做您想做的事情。这是一个例子:

class SubclassAttributes(type):
    def __getattr__(cls, name):  # classmethod of instances
        for subclass in cls.__subclasses__():
            if subclass.__name__ == name:
                return subclass
        else:
            raise TypeError('Class {!r} has no subclass '
                            'named {!r}'.format(cls.__name__, name))

class Base(object):
    __metaclass__ = SubclassAttributes  # Python 2 metaclass syntax

#class Base(object, metaclass=SubclassAttributes):  # Python 3 metaclass syntax
#    """ nothing to see here """

class Derived1(Base): pass
class Derived2(Base): pass

print(Base.Derived1)  # -> <class '__main__.Derived1'>
print(Base.Derived2)  # -> <class '__main__.Derived2'>
print(Base.Derived3)  # -> TypeError: Class 'Base' has no subclass named 'Derived3'

对于在 Python 2 和 3 中都有效的东西,如下所示定义类。从具有 SubclassAttributes 作为其元类的类派生 Base。这类似于六个模块的with_metaclass()功能:

class Base(type.__new__(type('TemporaryMeta', (SubclassAttributes,), {}),
                        'TemporaryClass', (), {})): pass
于 2012-08-08T11:04:41.877 回答
1
>>> class A(object):
...     pass
...
>>> foo = A()
>>> foo.__class__
<class '__main__.A'>
于 2012-08-08T03:46:47.437 回答