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

时间:2015-12-29 07:42:39

标签: python instance-variables

功能上有什么不同,以及

之间的幕后发生了什么
class Class:
    def __init__(self, var1):
        self.var1 = var1

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

2 个答案:

答案 0 :(得分:4)

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

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

c = Class('in inst')

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

>>> c.var1
'in inst'

它位于__dict__的{​​{1}}内:

c

类变量>>> c.__dict__ {'var1': 'in inst'} 位于var1的{​​{1}}中:

__dict__

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

Class

由于实例中没有任何内容,因此将使用该类中的>>> Class.__dict__['var1'] 'in class'

class Class2:
    var1 = 'in class'

c2 = Class2()

var1的{​​{1}}为空:

>>> c2.var1
'in class'

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

答案 1 :(得分:2)

正如我在评论中指出的,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