2024-04-27 04:36:31 发布
网友
我想得到一个类的属性,比如:
class MyClass(): a = "12" b = "34" def myfunc(self): return self.a
使用MyClass.__dict__给了我一个属性和函数的列表,甚至是像__module__和__doc__这样的函数。而MyClass().__dict__给我一个空的dict,除非我显式地设置了该实例的属性值。
MyClass.__dict__
__module__
__doc__
MyClass().__dict__
我只需要属性,在上面的例子中,这些属性是:a和b
a
b
def props(cls): return [i for i in cls.__dict__.keys() if i[:1] != '_'] properties = props(MyClass)
尝试inspect模块。getmembers和各种测试应该是有帮助的。
getmembers
编辑:
例如
class MyClass(object): a = '12' b = '34' def myfunc(self): return self.a >>> import inspect >>> inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a))) [('__class__', type), ('__dict__', <dictproxy {'__dict__': <attribute '__dict__' of 'MyClass' objects>, '__doc__': None, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, 'a': '34', 'b': '12', 'myfunc': <function __main__.myfunc>}>), ('__doc__', None), ('__module__', '__main__'), ('__weakref__', <attribute '__weakref__' of 'MyClass' objects>), ('a', '34'), ('b', '12')]
现在,这些特殊的方法和属性让我很紧张——它们可以通过多种方式处理,其中最简单的方法就是根据名称进行过滤。
>>> attributes = inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a))) >>> [a for a in attributes if not(a[0].startswith('__') and a[0].endswith('__'))] [('a', '34'), ('b', '12')]
…其中更复杂的可能包括特殊的属性名检查甚至元类;)
myfunc是MyClass的属性。这就是你跑步时的发现:
myfunc
MyClass
myinstance = MyClass() myinstance.myfunc()
它在myinstance上查找名为myfunc的属性,但找不到该属性,看到myinstance是MyClass的实例并在那里查找它。
myinstance
因此,MyClass的完整的属性列表是:
>>> dir(MyClass) ['__doc__', '__module__', 'a', 'b', 'myfunc']
(注意,我使用dir只是作为一种简单快捷的方法来列出类的成员:它应该只以探索的方式使用,而不是在生产代码中使用)
如果只需要特定的属性,则需要使用某些条件筛选此列表,因为__doc__、__module__和myfunc在任何方面都不特殊,它们与a和b完全相同。
我从来没有使用过Matt和Borealid提到的inspect模块,但是从一个简短的链接来看,它似乎有一些测试可以帮助您完成这项工作,但是您需要编写自己的谓词函数,因为您需要的大概是那些属性,这些属性不通过isroutine测试,并且不以两个下划线开头和结尾。
isroutine
另请注意:通过在Python2.7中使用class MyClass():,您正在使用过时的旧式类。除非是为了与非常旧的库兼容而故意这样做,否则应该将类定义为class MyClass(object):。在Python 3中没有“旧式”类,这种行为是默认的。但是,使用newstyle类将获得一个更自动定义的属性:
class MyClass():
class MyClass(object):
>>> class MyClass(object): a = "12" b = "34" def myfunc(self): return self.a >>> dir(MyClass) ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b', 'myfunc']
尝试inspect模块。
getmembers
和各种测试应该是有帮助的。编辑:
例如
现在,这些特殊的方法和属性让我很紧张——它们可以通过多种方式处理,其中最简单的方法就是根据名称进行过滤。
…其中更复杂的可能包括特殊的属性名检查甚至元类;)
myfunc
是MyClass
的属性。这就是你跑步时的发现:它在
myinstance
上查找名为myfunc
的属性,但找不到该属性,看到myinstance
是MyClass
的实例并在那里查找它。因此,
MyClass
的完整的属性列表是:(注意,我使用dir只是作为一种简单快捷的方法来列出类的成员:它应该只以探索的方式使用,而不是在生产代码中使用)
如果只需要特定的属性,则需要使用某些条件筛选此列表,因为
__doc__
、__module__
和myfunc
在任何方面都不特殊,它们与a
和b
完全相同。我从来没有使用过Matt和Borealid提到的inspect模块,但是从一个简短的链接来看,它似乎有一些测试可以帮助您完成这项工作,但是您需要编写自己的谓词函数,因为您需要的大概是那些属性,这些属性不通过
isroutine
测试,并且不以两个下划线开头和结尾。另请注意:通过在Python2.7中使用
class MyClass():
,您正在使用过时的旧式类。除非是为了与非常旧的库兼容而故意这样做,否则应该将类定义为class MyClass(object):
。在Python 3中没有“旧式”类,这种行为是默认的。但是,使用newstyle类将获得一个更自动定义的属性:相关问题 更多 >
编程相关推荐