当我在PyCharm中运行这个程序时,我得到以下错误

5 浏览
0 Comments

当我在PyCharm中运行这个程序时,我得到以下错误

当我运行这段代码时,我得到了以下错误:\n

\nTraceback (most recent call last): File \"C:/Users/Nabeel Hussain Syed/PycharmProjects/Hello World/check.py\", line 80, in \n print(spot.toString())\n File \"C:/Users/Nabeel Hussain Syed/PycharmProjects/Hello World/check.py\", line 66, in toString\n return \"{} is {} cm tall and {} kilograms and say {}. His owner is {}\".format(self.__name,\n AttributeError: \'Dog\' object has no attribute \'_Dog__name\'\n

\n打开图片链接查看错误。\n

    class Animal:
    __name = None
    __height = 0
    __weight = 0
    __sound = 0
    def __init__(self, name, height, weight, sound):
        self.__name = name
        self.__height = height
        self.__weight = weight
        self.__sound = sound
    def set_name(self, name):
        self.__name = name
    def set_height(self, height):
        self.__height = height
    def set_weight(self, weight):
        self.__weight = weight
    def set_sound(self, sound):
        self.__sound = sound
    def get_name(self):
        return self.__name
    def get_height(self):
        return str(self.__height)
    def get_weight(self):
        return str(self.__weight)
    def get_sound(self):
        return self.__sound
    def get_type(self):
        print("Animal")
    def toString(self):
        return "{} is {} cm tall and {} kilograms and say {}".format(self.__name,
                                                            self.__height,
                                                            self.__weight,
                                                            self.__sound)
cat = Animal('Whiskers', 33, 10, 'Meow')
print(cat.toString())
class Dog(Animal):
    __owner = ""
    def __init__(self,name,height,weight,sound,owner):
        self.__owner = owner
        super(Dog,self).__init__(name,height,weight,sound)
    def set_owner(self, owner):
        self.__owner = owner
    def get_owner(self):
        return self.__owner
    def get_type(self):
        print("Dog")
    def toString(self):
        return "{} is {} cm tall and {} kilograms and say {}. His owner is {}".format(self.__name,
                                                            self.__height,
                                                            self.__weight,
                                                            self.__sound,
                                                            self.__owner)
    def multiple_sounds(self, how_many=None):
        if how_many is None:
            print(self.get_sound())
        else:
            print(self.get_sound() * how_many)
spot = Dog("Spot", 53, 27, "Ruff", "Derek")
print(spot.toString())

0
0 Comments

当我在PyCharm中运行这个程序时,我遇到了以下错误。根据上面的内容,问题的出现原因是Python中的双下划线具有特殊意义。在类的作用域内部引用self.__var1会触发名称混淆。在类的外部,变量看起来是self._YourClassName__var1,而不是self.__var1。这种双下划线的使用不是每个人都会使用,对于简单的类来说,它感觉有点荒谬和烦人,不如使用单个下划线作为前缀。

然而,存在这种方式的理由是,如果你正在使用大量的继承,如果你只使用单个下划线作为前缀,那么你没有办法告诉阅读你代码的人“私有”和“受保护”变量之间的区别-那些甚至不应该被子类访问的变量和子类可以访问但外部世界不能访问的变量。在这种情况下,使用单个尾随下划线表示“受保护”,使用双下划线表示“私有”可能是一个有用的约定(名称混淆将允许子类在其子类中使用相同名称的变量而不会引起冲突)。

解决方法是,如果你想在类的外部访问以双下划线开头的变量,可以使用self._YourClassName__var1来代替self.__var1。

非常感谢。我现在完全理解了。我是一个Python新手,按照一个视频学习,那个人命名了相同的变量,而且他没有遇到任何错误。

0
0 Comments

当我在PyCharm中运行这个程序时,我遇到了以下错误。出现这个错误的原因是,以双下划线开头的属性被认为是“私有”的,子类无法访问这些属性。你仍然可以通过像_Animal__name这样的名称访问它们(Animal是定义属性的父类名称),但这是一种不好的做法。

官方文档中有更多信息:https://docs.python.org/3.6/tutorial/classes.html#private-variables

解决这个问题的方法是避免使用私有属性,或者使用正确的方式访问它们。

0