我是OOP的新手,但是我试图查看对象的var。建议使用object.__dict__
或vars(object)
其他Stack-O答案。所以我进入Python shell尝试一个简单的例子,但是我没有注意到这些答案都显示了对象的默认属性,仅显示了新分配的属性,例如:
>>> class Classy():
... inty = 3
... stringy = "whatevs"
...
>>> object = Classy()
>>> object.inty
3
>>> object.__dict__
{}
>>> vars(object)
{}
>>> object.inty = 27
>>> vars(object)
{'inty': 27}
>>> object.__dict__
{'inty': 27}
为什么变量以一种意义而不是另一种意义出现?是因为我没有明确初始化它们还是什么?
最佳答案
重要的理解是,在Python中,所有东西都是对象(包括函数和class
声明本身)
执行此操作时:
class Classy():
inty = 3
stringy = "whatevs"
您正在将
inty
和stringy
分配给Class
,而不是实例。检查一下:class Classy():
inty = 3
stringy = "whatevs"
print(Classy.__dict__)
等待...带
class
的__dict__
吗?是的,因为Classy
也是一个实例(类型为classobj
,因为您使用的是old style classes,所以实际上不应该这样做),应该从object
继承,这样您可以使用更多的东西)>>> print(type(Classy))
<type 'classobj'>
现在,如果您创建了classy实例,并为其添加了
inty
值,则您将拥有:class Classy():
inty = 3
stringy = "whatevs"
def __init__(self):
self.inty = 5
classy = Classy()
print("__dict__ of instance: %s" % classy.__dict__)
print("__dict__ of Class: %s" % classy.__class__.__dict__)
哪个输出
__dict__ of instance: {'inty': 5}
__dict__ of Class: {'__module__': '__main__', 'inty': 3, '__doc__': None, '__init__': <function __init__ at 0x1080de410>, 'stringy': 'whatevs'}
看到实例的
inty
中的__dict__
是5,但在类的__dict__
中仍然是3?这是因为现在有两个inty
:一个附加到classy
,一个类Classy
的实例,另一个附加到Classy
类本身(又是classobj
的实例)如果你做了
classy = Classy()
print(classy.inty)
print(classy.stringy)
您会看到:
5
whatevs
为什么?因为当您尝试在实例上获取
inty
时,Python会首先在实例的__dict__
中查找它。如果找不到,它将转到该类的__dict__
。这就是classy.stringy
上发生的事情。是在classy
实例中吗?不对它在Classy
类中吗?是的好吧,归还那个……那就是你所看到的那个。另外,我提到Classy类是一个对象,对吗?因此,您可以将其分配给其他类似的对象:
What = Classy # No parenthesis
foo = What()
print(foo.inty)
而且您会看到在
5
中“附加”的Classy.__init__
,因为当您执行What = Classy
时,您正在将class Classy
分配给名为What
的变量,而当您执行foo=What()
时,实际上正在运行Classy
的构造函数(请记住:What
和Classy
是同一件事)Python允许的另一件事(我个人不喜欢,因为这使代码很难遵循)将属性“即时”附加到实例:
classy = Classy()
try:
print(classy.other_thing)
except AttributeError:
print("Oh, dang!! No 'other_thing' attribute!!")
classy.other_thing = "hello"
print(classy.other_thing)
将输出
Oh, dang!! No 'other_thing' attribute!!
hello
哦,我是否说过函数是对象?是的,它们是...,因此,您还可以为它们分配属性(也可以使代码变得非常混乱),但是您可以这样做...
def foo_function():
return None # Very dummy thing we're doing here
print("dict of foo_function=%s" % foo_function.__dict__)
foo_function.horrible_thing_to_do = "http://www.nooooooooooooooo.com/"
print("Horrible thing? %s" % foo_function.horrible_thing_to_do)
输出:
dict of foo_function={}
Horrible thing? http://www.nooooooooooooooo.com/
关于python - Python2-打印对象的默认属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48030419/