我是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"


您正在将intystringy分配给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的构造函数(请记住:WhatClassy是同一件事)

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/

10-12 21:12