Heim  >  Fragen und Antworten  >  Hauptteil

Python-Neuling bezüglich des Versagens von Methoden in Klassen beim Abrufen von Variablen

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?

仅有的幸福仅有的幸福2675 Tage vor790

Antworte allen(4)Ich werde antworten

  • 三叔

    三叔2017-06-22 11:55:00

    简单来讲就是你的get函数并没有将你的变量"哈哈"和20 赋值进去类的属性

    def get_name(self):
        return new_name
    def get_age(self):
        return new_age
    
    加两个设置函数
    def set_name(self,new_name):
        self.new_name = new_name
    def set_age(self,new_age):
        self.new_age = new_age

    你画的箭头,其实指向的是上面get函数两个,并不是你的Attr函数。

    Antwort
    0
  • 阿神

    阿神2017-06-22 11:55:00

    你的 cat.get_name("哈哈") 返回了一个局部变量 new_name 的值, 并没有改变 self.new_name 的值,所以执行 self.name = self.get_name(self.new_name) 之后 self.name 仍是 0.

    Antwort
    0
  • 巴扎黑

    巴扎黑2017-06-22 11:55:00

    你的属性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_name
    return self.new_name

    def get_age(self, new_age):

    self.new_age = new_age
    return 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

    Antwort
    0
  • 仅有的幸福

    仅有的幸福2017-06-22 11:55:00

    def get_name(self, new_name):
        return new_name

    这里只是直接返回函数的参数,其他什么也没做。你可以尝试执行print(cat.get_name('xxx')),查看这个函数的返回结果。类属性new_name依然是0。因此,在Attributes中,相当于传进去的是0,所以self.name得到的也是0。这就是打印出来的结果依然是0的原因。

    但是看样子你还处于入门阶段,同时有可能是从Java转过来的。。。所以若想从根本上解决这一类问题,我有以下几点建议。

    • 不要裸用getset,建议使用@property,搜索这个关键字来了解相关知识。

    • 你在Cat类中尝试用self去访问name,表明你希望这是一个实例属性。实例属性请全部放在__init__中,不要在其他方法中初始化实例属性。

    建议进一步夯实Python基础。

    Antwort
    0
  • StornierenAntwort