python类的实例化问题
classMen:a=[]def__init__(self,b):self.a.append(b)defsayHi(self):print'Hello,mynameis'...
class Men:
a=[]
def __init__(self,b):
self.a.append(b)
def sayHi(self):
print'Hello,my name is',self.a
newmen1=Men(1)
newmen1.sayHi()
newmen2=Men(2)
newmen2.sayHi()
newmen1.sayHi()
以上代码的输出为什么是:
Hello,my name is [1]
Hello,my name is [1, 2]
Hello,my name is [1, 2]
newmen2用2进行实例化为什么会影响到newmen1对象的a[]变量?
如果代码改成:
class Men:
a=0
def __init__(self,b):
self.a=b
def sayHi(self):
print'Hello,my name is',self.a
newmen1=Men(1)
newmen1.sayHi()
newmen2=Men(2)
newmen2.sayHi()
newmen1.sayHi()
输出结果又是:
Hello,my name is 1
Hello,my name is 2
Hello,my name is 1
这时候为什么newmen2的实例化不影响newmen1的a变量了呢???这两个例子怎么解释??? 展开
a=[]
def __init__(self,b):
self.a.append(b)
def sayHi(self):
print'Hello,my name is',self.a
newmen1=Men(1)
newmen1.sayHi()
newmen2=Men(2)
newmen2.sayHi()
newmen1.sayHi()
以上代码的输出为什么是:
Hello,my name is [1]
Hello,my name is [1, 2]
Hello,my name is [1, 2]
newmen2用2进行实例化为什么会影响到newmen1对象的a[]变量?
如果代码改成:
class Men:
a=0
def __init__(self,b):
self.a=b
def sayHi(self):
print'Hello,my name is',self.a
newmen1=Men(1)
newmen1.sayHi()
newmen2=Men(2)
newmen2.sayHi()
newmen1.sayHi()
输出结果又是:
Hello,my name is 1
Hello,my name is 2
Hello,my name is 1
这时候为什么newmen2的实例化不影响newmen1的a变量了呢???这两个例子怎么解释??? 展开
2个回答
展开全部
你没有理解类变量和实例变量之间的关系。
第一个例子里面init中append是对类变量的操作。因此实例对象newmen1/2并没有自己的变量a,访问的都是类变量。
这时你如果显示类变量,
print Men.a,newmen1.a,newmen2.a都是一样的。指向同一变量。
第二个例子中的init生成了对象自己的变量a,注意'='! 当实例对象调用init时,每个实例对象都拥有了自己的变量a,你再也无法再通过实例对象来访问到类变量了。事实上这种写法是很不好的。
这时你可以再一次显示类变量,
print Men.a,newmen1.a,newmen2
>> 0 1 2
如果你希望所有对象共用类变量,你可以写
class Men:
a=0
def __init__(self,b):
Men.a=b
def sayHi(self):
print'Hello,my name is',Men.a
这样反而清晰,不要把实例对象公有的变量用self来表示。只会把你自己搞晕。
第一个例子里面init中append是对类变量的操作。因此实例对象newmen1/2并没有自己的变量a,访问的都是类变量。
这时你如果显示类变量,
print Men.a,newmen1.a,newmen2.a都是一样的。指向同一变量。
第二个例子中的init生成了对象自己的变量a,注意'='! 当实例对象调用init时,每个实例对象都拥有了自己的变量a,你再也无法再通过实例对象来访问到类变量了。事实上这种写法是很不好的。
这时你可以再一次显示类变量,
print Men.a,newmen1.a,newmen2
>> 0 1 2
如果你希望所有对象共用类变量,你可以写
class Men:
a=0
def __init__(self,b):
Men.a=b
def sayHi(self):
print'Hello,my name is',Men.a
这样反而清晰,不要把实例对象公有的变量用self来表示。只会把你自己搞晕。
追问
为什么self.a.append(b)这个不会生成对象自己的变量?而self.a=b却生成了。self 这个关键字不就是指代对象么?所以self.a应该代表了对象里的变量才对啊。麻烦您再讲解一下,谢谢
追答
记住:等号相当于create,而‘.’开头的函数是对已有的对象的修改。如.append,只能增加,所以对象没有这个变量的时候会改到类变量上面去。否则会直接报错。当你使用'='时你就创建了一个对象的变量a.
我再次强调这是一种很不好的写法,
如果你希望每个对象里有一个独立的list a,你应该在__init__里面写
def __init__(self,b):
self.a = []
self.append(b)
如果你想对类的对象赋值,应该使用
self.__class__.a.append(b)
python没有直接报错只是因为他试图理解你并表现的友好。
>>> class Men:
... a=[]
... def __init__(self,b):
... self.a.append(b) #这是对类变量的操作
... self.a = self.a #这时对象已经拥有了自己的变量a
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询