【问题标题】:When I run this program in PyCharm I get the following errors当我在 PyCharm 中运行该程序时,出现以下错误
【发布时间】:2023-11-07 03:57:01
【问题描述】:

当我运行这段代码时。我收到以下错误

Traceback(最近一次调用最后一次):文件“C:/Users/Nabeel Hussain Syed/PycharmProjects/Hello World/check.py”,第 80 行,在 打印(spot.toString()) 文件“C:/Users/Nabeel Hussain Syed/PycharmProjects/Hello World/check.py”,第 66 行,在 toString 中 return "{} 身高 {} 厘米,体重 {} 公斤,然后说 {}。他的主人是 {}".format(self.__name, AttributeError: 'Dog' 对象没有属性 '_Dog__name'

Open the link of the image to check out the errors.

    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())

【问题讨论】:

  • 请,,不要使用那个“约定”。 Python 不是 Java,不要强求。如果您必须从课堂外控制分配,请使用属性。

标签: python runtime-error attributeerror


【解决方案1】:

名称以双下划线开头的属性被认为是“私有的”,不能从子类访问。您仍然可以通过 _Animal__name 之类的名称访问它们(Animal 是定义属性的父类名称),但这是一种不好的做法。

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

【讨论】:

    【解决方案2】:

    双下划线在 Python 中很重要。请参阅previous stack overflow answer 的这段摘录:

    双下划线

    这个实际上有句法意义。参考 类范围内的 self.__var1 调用名称修饰。 在您的班级之外,该变量将出现在 self._YourClassName__var1 而不是 self.__var1。不是每个人都使用 这个 - 我们根本不在我工作的地方 - 对于简单的课程来说,感觉 就像使用单一的有点荒谬和令人恼火的选择 前导下划线。

    但是,它的存在是有理由的;如果你正在使用 很多继承,如果你只使用单个前导下划线,那么 你没有办法向阅读你的代码的人表明 “私有”和“受保护”变量之间的区别 - 那些 甚至不打算被子类访问,而那些 子类可以访问,但外部世界不能。用一个 单个尾随下划线表示“受保护”和双下划线 因此,表示“私人”可能是一个有用的约定 情况(并且名称修饰将允许子类使用 在其子类中具有相同名称的变量而不会导致 碰撞)。

    【讨论】:

    • 非常感谢。我现在完全明白了。我正在关注一个视频,因为我是 Python 的新手,其中那个人命名了相同的变量并且他没有收到任何错误。
    最近更新 更多