Mad*_*ist 256 python class python-3.x
有没有办法获取类实例上存在的属性列表?
class new_class():
def __init__(self, number):
self.multi = int(number) * 2
self.str = str(number)
a = new_class(2)
print(', '.join(a.SOMETHING))
Run Code Online (Sandbox Code Playgroud)
期望的结果是将输出"multi,str".我希望这能看到脚本各个部分的当前属性.
小智 248
>>> class new_class():
... def __init__(self, number):
... self.multi = int(number) * 2
... self.str = str(number)
...
>>> a = new_class(2)
>>> a.__dict__
{'multi': 4, 'str': '2'}
>>> a.__dict__.keys()
dict_keys(['multi', 'str'])
Run Code Online (Sandbox Code Playgroud)
您也可以找到有用的pprint.
Hte*_*hno 153
dir(instance)
# or (same value)
instance.__dir__()
# or
instance.__dict__
Run Code Online (Sandbox Code Playgroud)
然后你可以测试使用什么类型type()
或者是否是一个方法callable()
.
Sil*_*ost 31
>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'
Run Code Online (Sandbox Code Playgroud)
这当然会打印类定义中的任何方法或属性.您可以通过更改i.startwith('__')
为"排除""私有"方法i.startwith('_')
Fer*_*dox 23
该检查模块提供了简便的方法来检查的对象:
inspect模块提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象.
使用getmembers()
您可以查看班级的所有属性及其值.要排除私有或受保护的属性使用.startswith('_')
.要排除方法或功能,请使用inspect.ismethod()
或inspect.isfunction()
.
import inspect
class NewClass(object):
def __init__(self, number):
self.multi = int(number) * 2
self.str = str(number)
def func_1(self):
pass
a = NewClass(2)
for i in inspect.getmembers(a):
# Ignores anything starting with underscore
# (that is, private and protected attributes)
if not i[0].startswith('_'):
# Ignores methods
if not inspect.ismethod(i[1]):
print(i)
Run Code Online (Sandbox Code Playgroud)
注意,ismethod()
在第二个元素上使用,i
因为第一个元素只是一个字符串(它的名字).
Offtopic:使用CamelCase作为类名.
gre*_*pit 22
之前的所有答案都是正确的,您可以根据自己的要求选择三个选项
1. DIR()
2. VARS()
3. __dict__
>>> dir(a)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'multi', 'str']
>>> vars(a)
{'multi': 4, 'str': '2'}
>>> a.__dict__
{'multi': 4, 'str': '2'}
Run Code Online (Sandbox Code Playgroud)
Mic*_*oka 11
通常会提到要列出您应该使用的完整属性列表dir()
.但请注意,与普遍看法相反,dir()
并没有带出所有属性.例如,您可能会注意到__name__
类的dir()
列表中可能会丢失,即使您可以从类本身访问它.来自doc on dir()
(Python 2,Python 3):
因为dir()主要是为了方便在交互式提示中使用而提供的,所以它尝试提供一组有趣的名称,而不是尝试提供严格或一致定义的名称集,并且其详细行为可能会在不同版本之间发生变化.例如,当参数是类时,元类属性不在结果列表中.
像下面这样的函数往往更加完整,尽管不能保证完整性,因为返回的列表dir()
可能会受到许多因素的影响,包括实现__dir__()
方法,或自定义__getattr__()
或__getattribute__()
在类或其父类之一上.请参阅提供的链接以获取更多详
def dirmore(instance):
visible = dir(instance)
visible += [a for a in set(dir(type)).difference(visible)
if hasattr(instance, a)]
return sorted(visible)
Run Code Online (Sandbox Code Playgroud)
Jas*_*gel 10
您可以dir(your_object)
用来获取属性和getattr(your_object, your_object_attr)
获取值
用法:
for att in dir(your_object):
print (att, getattr(your_object,att))
Run Code Online (Sandbox Code Playgroud)
如果您的对象没有__dict__,这将特别有用。如果不是这种情况,您也可以尝试var(your_object)
你想要什么?在不知道您的确切意图的情况下,可能很难为您提供最佳答案.
如果要以特定方式显示类的实例,则手动执行此操作几乎总是更好.这将包括您想要的内容,而不包括您不想要的内容,订单将是可预测的.
如果您正在寻找显示类内容的方法,请手动设置您关注的属性的格式,并将其作为类的方法__str__
或__repr__
方法提供.
如果您想了解对象有哪些方法可以理解它是如何工作的,请使用help
.help(a)
将根据其文档字符串向您显示有关对象类的格式化输出.
dir
存在以编程方式获取对象的所有属性.(访问会__dict__
做一些我会分组但我不会自己使用的东西.)但是,这可能不包括你想要的东西,它可能包括你不想要的东西.这是不可靠的,人们认为他们比他们更经常地想要它.
在某种程度上正交的说明中,目前对Python 3的支持很少.如果您有兴趣编写真正的软件,那么您将需要第三方的东西,如numpy,lxml,Twisted,PIL或任何数量的Web框架,这些框架还不支持Python 3,并且没有任何时间计划.2.6和3.x分支之间的差异很小,但库支持的差异很大.
有多种方法可以做到:
#! /usr/bin/env python3
#
# This demonstrates how to pick the attiributes of an object
class C(object) :
def __init__ (self, name="q" ):
self.q = name
self.m = "y?"
c = C()
print ( dir(c) )
Run Code Online (Sandbox Code Playgroud)
运行时,此代码生成:
jeffs@jeff-desktop:~/skyset$ python3 attributes.py
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm', 'q']
jeffs@jeff-desktop:~/skyset$
Run Code Online (Sandbox Code Playgroud)
小智 7
请参阅已按顺序执行的python shell脚本,在这里您将获得以逗号分隔的字符串格式的类的属性.
>>> class new_class():
... def __init__(self, number):
... self.multi = int(number)*2
... self.str = str(number)
...
>>> a = new_class(4)
>>> ",".join(a.__dict__.keys())
'str,multi'<br/>
Run Code Online (Sandbox Code Playgroud)
我正在使用python 3.4
除了这些答案之外,我还将包含一个函数 (python 3),用于喷出几乎任何值的整个结构。它用于dir
建立属性名称的完整列表,然后getattr
与每个名称一起使用。它显示值的每个成员的类型,并在可能的情况下显示整个成员:
import json
def get_info(obj):
type_name = type(obj).__name__
print('Value is of type {}!'.format(type_name))
prop_names = dir(obj)
for prop_name in prop_names:
prop_val = getattr(obj, prop_name)
prop_val_type_name = type(prop_val).__name__
print('{} has property "{}" of type "{}"'.format(type_name, prop_name, prop_val_type_name))
try:
val_as_str = json.dumps([ prop_val ], indent=2)[1:-1]
print(' Here\'s the {} value: {}'.format(prop_name, val_as_str))
except:
pass
Run Code Online (Sandbox Code Playgroud)
现在,以下任何一项都应该提供洞察力:
get_info(None)
get_info('hello')
import numpy
get_info(numpy)
# ... etc.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
506950 次 |
最近记录: |