Python中特定类名的列表

Python中特定类名的列表,python,Python,有没有一种方法可以标记类声明,以便以后可以标记它们的列表 还是一种让所有类都以某个字符串开头的方法 或者是特定类的子类的所有类?注意:在下面的例子中,我假设Python3.x。对于Python2.x,使用,即写入classt(object):pass,而不是classt:pass 首先,定义一些类: >>> class T: pass ... >>> class S: pass ... >>> class U(T): pass ...

有没有一种方法可以标记类声明,以便以后可以标记它们的列表

还是一种让所有类都以某个字符串开头的方法


或者是特定类的子类的所有类?

注意:在下面的例子中,我假设Python3.x。对于Python2.x,使用,即写入
classt(object):pass,而不是
classt:pass

  • 首先,定义一些类:

    >>> class T: pass
    ... 
    >>> class S: pass
    ... 
    >>> class U(T): pass
    ...
    
  • 要获取在当前作用域中定义的类的列表,请在(或)上迭代,并使用以下命令测试它们是否是(因此是类!)的实例:

  • 用于将搜索限制为给定类的子类(在本例中为
    T
    ):

  • 您可能希望省略
    T
    本身:

    >>> [n for n, o in globals().items() if o != T and isinstance(o, type) and issubclass(o, (T,))]
    ['U']
    
  • 要获取以特定字符串开头的所有类,请调用类名:

    >>> [n for n, o in globals().items() if n.startswith('T') and isinstance(o, type)]
    ['T']
    
  • 要在创建时标记某些类,请使用†添加属性,例如
    \uuuu-flagged\uuuu

    >>> def flag(cls):
    ...     cls.__flag__ = 'flagged'
    ...     return cls
    ... 
    >>> @flag
    ... class X: pass
    ... 
    >>> @flag
    ... class Y: pass
    ... 
    >>> class Z: pass
    ... 
    
  • 现在,您只需选择那些使用
    \uuuuu flag\uuuuu
    属性分类的对象:

    >>> [n for n, o in globals().items() if isinstance(o, type) and hasattr(o, '__flag__')]
    ['X', 'Y']
    


  • †:注意,类装饰器是。

    注意:在下面我假设Python 3.x。对于Python2.x,使用,即写入
    classt(object):pass,而不是
    classt:pass

  • 首先,定义一些类:

    >>> class T: pass
    ... 
    >>> class S: pass
    ... 
    >>> class U(T): pass
    ...
    
  • 要获取在当前作用域中定义的类的列表,请在(或)上迭代,并使用以下命令测试它们是否是(因此是类!)的实例:

  • 用于将搜索限制为给定类的子类(在本例中为
    T
    ):

  • 您可能希望省略
    T
    本身:

    >>> [n for n, o in globals().items() if o != T and isinstance(o, type) and issubclass(o, (T,))]
    ['U']
    
  • 要获取以特定字符串开头的所有类,请调用类名:

    >>> [n for n, o in globals().items() if n.startswith('T') and isinstance(o, type)]
    ['T']
    
  • 要在创建时标记某些类,请使用†添加属性,例如
    \uuuu-flagged\uuuu

    >>> def flag(cls):
    ...     cls.__flag__ = 'flagged'
    ...     return cls
    ... 
    >>> @flag
    ... class X: pass
    ... 
    >>> @flag
    ... class Y: pass
    ... 
    >>> class Z: pass
    ... 
    
  • 现在,您只需选择那些使用
    \uuuuu flag\uuuuu
    属性分类的对象:

    >>> [n for n, o in globals().items() if isinstance(o, type) and hasattr(o, '__flag__')]
    ['X', 'Y']
    


  • †:请注意,类装饰器是。

    您也可以使用元类收集定义的类:

    class AllSeeingMetaClass(type):
        # This will be a list of all the classes that use us as a metaclass.
        the_classes = []
    
        def __new__(meta, classname, bases, classDict):
            # Invoked as new classes are defined.
            print "Defining %r" % classname
            new_class = type.__new__(meta, classname, bases, classDict)
            meta.the_classes.append(new_class)
            return new_class
    
    
    class MyBase(object):
        # A base class that pulls in our metaclass.
        __metaclass__ = AllSeeingMetaClass
    
    
    class Cat(MyBase):
        def __init__(self):
            pass
    
    class Dog(MyBase):
        def __init__(self):
            pass
    
    print AllSeeingMetaClass.the_classes
    
    印刷品:

    Defining 'MyBase'
    Defining 'Cat'
    Defining 'Dog'
    [<class '__main__.MyBase'>, <class '__main__.Cat'>, <class '__main__.Dog'>]
    
    定义“MyBase”
    定义“猫”
    定义“狗”
    [, ]
    
    您还可以使用元类收集定义的类:

    class AllSeeingMetaClass(type):
        # This will be a list of all the classes that use us as a metaclass.
        the_classes = []
    
        def __new__(meta, classname, bases, classDict):
            # Invoked as new classes are defined.
            print "Defining %r" % classname
            new_class = type.__new__(meta, classname, bases, classDict)
            meta.the_classes.append(new_class)
            return new_class
    
    
    class MyBase(object):
        # A base class that pulls in our metaclass.
        __metaclass__ = AllSeeingMetaClass
    
    
    class Cat(MyBase):
        def __init__(self):
            pass
    
    class Dog(MyBase):
        def __init__(self):
            pass
    
    print AllSeeingMetaClass.the_classes
    
    印刷品:

    Defining 'MyBase'
    Defining 'Cat'
    Defining 'Dog'
    [<class '__main__.MyBase'>, <class '__main__.Cat'>, <class '__main__.Dog'>]
    
    定义“MyBase”
    定义“猫”
    定义“狗”
    [, ]
    
    要从类本身中获取子类列表,请使用父类中的uuu subclass_uuu方法

    >>>class Parent(object):
    ...    pass
    ...
    >>>class Child(Parent):
    ...    pass
    ...
    >>>Parent.__subclasses__()
    >>>[<class '__main__.Child'>]
    
    类父对象(对象): ... 通过 ... >>>班级儿童(家长): ... 通过 ... >>>父类。子类 >>>[]

    不幸的是,关于这个方法的文档太少了。

    要从类本身中获取子类列表,请使用父类中的uuu subclass_uuu方法

    >>>class Parent(object):
    ...    pass
    ...
    >>>class Child(Parent):
    ...    pass
    ...
    >>>Parent.__subclasses__()
    >>>[<class '__main__.Child'>]
    
    类父对象(对象): ... 通过 ... >>>班级儿童(家长): ... 通过 ... >>>父类。子类 >>>[]

    不幸的是,关于这个方法的文档太少了。

    bobince:是的,我刚刚意识到它在2.x中不起作用,因为我忘了使用新的样式类……这对于Python2.x也很好。。。类装饰器在2.6中是新出现的。哈,现在看来我看到了未来,知道你会评论;)谢谢你的快速回答。我可能会使用is子类减去T的解。谢谢bobince:是的,我刚刚意识到它在2.x中不起作用,因为我忘了使用新样式的类…这对于Python2.x来说也很好。。。类装饰器在2.6中是新出现的。哈,现在看来我看到了未来,知道你会评论;)谢谢你的快速回答。我可能会使用is子类减去T的解。谢谢使用
    grep
    搜索源代码有什么问题?您拥有所有Python的源代码。为什么不能在这些文件上简单地使用
    grep
    ?使用
    grep
    搜索源代码有什么错?您拥有所有Python的源代码。为什么不能在这些文件上简单地使用
    grep