1

我想要的是以下内容:

lst = []

class Awesome:
  """This is my magical super class."""

  ...

class Inherits(Awesome):
  """Awesome does awesome stuff with Inherits."""
  name = "Stack"

class InheritsAgain(Awesome):
  name = "Overflow"

print(lst)
#: ['Stack', 'Overflow']

所以基本上,当类InheritsInheritsAgain被定义时,因为它们继承自AwesomeAwesome具有一些元类魔法(或其他),它从继承类中读取属性name,并将其附加到lst.

我已经查看了 Python 中的元类,但我不确定这将如何组合在一起。

这在 Python 中可能吗?如果是的话,你会怎么做?

编辑:

让我们添加到上面的示例中,这样它也可以工作:

class AndAgain(Awesome):
  name = "/root/path/<name>/<id>"

  def go():
    pass

我希望定义整个类AndAgain,以便我可以检查并查看它name与 value 的存在"/root/path/<name>/<id>",并且该函数go()也存在。

4

2 回答 2

2
lst = []

class AwesomeMeta(type):
    def __new__(metacls, cls, bases, classdict):
        if cls != 'Awesome':
            lst.append(cls)
        return super().__new__(metacls, cls, bases, classdict)

class Awesome(metaclass=AwesomeMeta):
  """This is my magical super class."""


class Stack(Awesome):
  """Awesome does awesome stuff with Inherits."""


class Overflow(Awesome):
    """More awesomely stuff!"""

print(lst)

并展示在课堂上的样子:

lst = []

class AwesomeMeta(type):
    def __new__(metacls, cls, bases, classdict):
        if 'name' in classdict:
            lst.append(classdict['name'])
        return super().__new__(metacls, cls, bases, classdict)

class Awesome(metaclass=AwesomeMeta):
    """This is my magical super class."""


class Inherits(Awesome):
    """Awesome does awesome stuff with Inherits."""

    name = 'Stack'


class InheritsAgain(Awesome):
    """More awesomely stuff!"""

    name = 'Overflow'

class AndAgain(Awesome):
    name = "/root/path/<name>/<id>"

    def go():
        pass

print(lst)
于 2013-06-13T06:54:51.720 回答
1

可以使用元类

class AwesomeMeta(type):
    lst = []
    def __new__(metacls, cls, bases, classdict):
        if 'name' in classdict:
            metacls.lst.append(classdict['name'])
        return super(AwesomeMeta, metacls).__new__(metacls, cls, bases, classdict)

class Awesome(object):
    """This is my magical super class."""
    __metaclass__ = AwesomeMeta


class Inherits(Awesome):
    """Awesome does awesome stuff with Inherits."""
    name = 'Stack'


class InheritsAgain(Awesome):
    """More awesomely stuff!"""
    name = 'Overflow'

print InheritsAgain.lst, Inherits.lst, Awesome.lst

或者一个可以使用的__subclasses__方法

print [i.name for i in Awesome.__subclasses__()]

或者可以使用类装饰器

lst = []
def cls_decorator(cls):
    lst.append(cls.name)
    return cls

@cls_decorator
class Awesome(object):
    """This is my magical super class."""
    name = 'Awesome'


@cls_decorator
class Inherits(Awesome):
    """Awesome does awesome stuff with Inherits."""
    name = 'Stack'


@cls_decorator
class InheritsAgain(Awesome):
    """More awesomely stuff!"""
    name = 'Overflow'

解决方案应该取决于你要做什么

于 2013-06-13T07:13:00.997 回答