python小白 关于类里面的方法获取变量失败的问题
问题描述
代码如下:
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()
执行结果:
我的问题:
我已经传入了2个值,一个哈哈,一个20为什么打印出来的还是0?
问题解答
回答1:简单来讲就是你的get函数并没有将你的变量'哈哈'和20 赋值进去类的属性
def get_name(self): return new_namedef get_age(self): return new_age加两个设置函数def set_name(self,new_name): self.new_name = new_namedef set_age(self,new_age): self.new_age = new_age
你画的箭头,其实指向的是上面get函数两个,并不是你的Attr函数。
回答2:你的 cat.get_name('哈哈') 返回了一个局部变量 new_name 的值, 并没有改变 self.new_name 的值,所以执行 self.name = self.get_name(self.new_name) 之后 self.name 仍是 0.
回答3:你的属性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):
self.new_name = new_namereturn self.new_name
def get_age(self, new_age):
self.new_age = new_agereturn self.new_age
或者提供set方法:
def set_new_name(self, new_name):
self.new_name = new_name
def set_new_age(self, new_age):
self.new_age = new_age
def get_name(self):
return self.new_name
def get_age(self):
return self.new_age回答4:
def get_name(self, new_name): return new_name
这里只是直接返回函数的参数,其他什么也没做。你可以尝试执行print(cat.get_name(’xxx’)),查看这个函数的返回结果。类属性new_name依然是0。因此,在Attributes中,相当于传进去的是0,所以self.name得到的也是0。这就是打印出来的结果依然是0的原因。
但是看样子你还处于入门阶段,同时有可能是从Java转过来的。。。所以若想从根本上解决这一类问题,我有以下几点建议。
不要裸用get和set,建议使用@property,搜索这个关键字来了解相关知识。
你在Cat类中尝试用self去访问name,表明你希望这是一个实例属性。实例属性请全部放在__init__中,不要在其他方法中初始化实例属性。
建议进一步夯实Python基础。
相关文章:
1. html5 - 百度Ueditor代码高亮和代码段滚动条冲突是怎么回事?2. javascript - 静态页面引公共头尾文件,js怎么写吖?3. docker gitlab 如何git clone?4. javascript - 读取页面源码,页面中所有的换行都被当成<br/>读取出来 了,,求解应该怎么让它被正确的解析5. javascript - 关于一段 for 循环代码执行顺序的问题6. java - 3个dao的数据根据请求参数选择一个映射到一个url上,怎么写比较好?7. docker 17.03 怎么配置 registry mirror ?8. docker网络端口映射,没有方便点的操作方法么?9. 如何调整IDEA中直接运行java程序的日志输出级别?10. docker绑定了nginx端口 外部访问不到