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

私があなたの質問を正しく理解していれば、インスタンスに を追加するカスタム メタクラスを使用して、やりたいことを実行でき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 を派生させます。これは、 sixモジュールの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 に答える