在Python中声明实例变量的两种方法



在功能和幕后发生的事情方面有什么区别吗

class Class:
    def __init__(self, var1):
        self.var1 = var1

class Class:
    var1 = ""
    def __init__(self, var1):
        self.var1 = var1

在Python中?

让我们来探究一下。这是你的班级:

class Class:
    var1 = 'in class'
    def __init__(self, var1):
        self.var1 = var1
c = Class('in inst')

访问c.var1显示实例中的var1

>>> c.var1
'in inst'

位于c:的__dict__内部

>>> c.__dict__
{'var1': 'in inst'}

类变量var1Class:的__dict__

>>> Class.__dict__['var1']
'in class'

现在创建一个只有类变量的类:

class Class2:
    var1 = 'in class'
c2 = Class2()

由于实例中没有任何内容,将使用类中的var1

>>> c2.var1
'in class'

c2__dict__为空:

>>> c2.__dict__
{}

Python总是先在实例中查找var1,然后再返回到类中。

正如我在评论中指出的,class.var1是一个共享变量。如果不使用__init__中的非共享变量擦除它,则每个实例都可以将其访问为self.var1。以下是发生的情况的示例:
class Test(object):
    shared = 0
    def __init__(self, i):
        self.notshared = i
    def intro(self):
        print("Shared is " + str(self.shared))
        print("NotShared is " + str(self.notshared))
test1 = Test(4)
test1.intro()
# Shared is 0
# NotShared is 4
Test.shared = 5
test1.intro()
# Shared is 5
# NotShared is 4
test2 = Test(3)
test2.intro()
# Shared is 5
# NotShared is 3

但是,请注意,如果之后编写self.shared变量,则不再使用self.shared访问共享变量:

test1.shared = 12
test1.intro()
# Shared is 12
# NotShared is 4
test2.intro()
# Shared is 5
# NotShared is 3

相关内容

  • 没有找到相关文章

最新更新