Der Code lautet wie folgt:
class Cat:
#属性
new_name = 0
new_age = 0
#方法
def get_name(self,new_name):
return new_name
def get_age(self,new_age):
return new_age
def Attributes(self):
self.name = self.get_name(self.new_name)
self.age = self.get_age(self.new_age)
print(self.name)
print(self.age)
def show(self):
print(self.name)
print(self.age)
#cat = Cat()
cat = Cat()
cat.get_name("哈哈")
cat.get_age(20)
cat.Attributes()
cat.show()
Ausführungsergebnis:
Meine Frage:
Ich habe 2 Werte übergeben, einen haha und einen 20
Warum wird immer noch 0 gedruckt?
简单来讲就是你的get函数并没有将你的变量"哈哈"和20 赋值进去类的属性
你画的箭头,其实指向的是上面get函数两个,并不是你的Attr函数。
你的
cat.get_name("哈哈")
返回了一个局部变量new_name
的值, 并没有改变self.new_name
的值,所以执行self.name = self.get_name(self.new_name)
之后self.name
仍是0
.你的属性new_name 和 new_age 属于Cat的属性,要对类的属性赋值和访问必须使用类对象,在本类里面访问就是self(代表了本类的对象可以理解为c++里面的this指针,通过self可以调用类的属性和方法),而你在get_name 和 get_age 中没有对类的属性赋值,只是把方法传进来的数据重新返回了,所以Cat类的属性new_name 和 new_age 没有进行过重新赋值还是原来的0,要是想改变Cat类的new_name, new_age两个值可以在改成:
def get_name(self, new_name):
def get_age(self, new_age):
或者提供set方法:
def set_new_name(self, new_name):
def set_new_age(self, new_age):
def get_name(self):
def get_age(self):
这里只是直接返回函数的参数,其他什么也没做。你可以尝试执行
print(cat.get_name('xxx'))
,查看这个函数的返回结果。类属性new_name
依然是0
。因此,在Attributes
中,相当于传进去的是0,所以self.name
得到的也是0
。这就是打印出来的结果依然是0
的原因。但是看样子你还处于入门阶段,同时有可能是从Java转过来的。。。所以若想从根本上解决这一类问题,我有以下几点建议。
不要裸用
get
和set
,建议使用@property
,搜索这个关键字来了解相关知识。你在
Cat
类中尝试用self
去访问name
,表明你希望这是一个实例属性。实例属性请全部放在__init__
中,不要在其他方法中初始化实例属性。建议进一步夯实Python基础。