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
?