时钟程序继承帮助 - Python

时间:2017-11-18 18:26:10

标签: python class inheritance

我正在使用类和继承来在Python上创建时钟。我正在尝试在Fecha类中创建一个函数advance(),它继承了Calendar和Clock。我尝试将属性称为self .__ hora,但我得到"属性错误:Fecha对象没有属性..."。我只发布一部分代码,因为它有点大:

class Reloj(object):

    __segundo = Contador(0, 60)
    __minuto = Contador(0, 60)
    __hora = Contador(0, 24)

    def __init__(self, s, minu, h):

        self.__segundo.setCuenta(s)
        self.__minuto.setCuenta(minu)
        self.__hora.setCuenta(h)


    def set(self, s, minu, h):

        self.__segundo.setCuenta(s)
        self.__minuto.setCuenta(minu)
        self.__hora.setCuenta(h)

    def tic(self):

        self.__segundo.contar()

Class Reloj有点大,但其余只是显示功能。这是Fecha课程:

class Fecha(Reloj, Calendario):

def __init__(self,d,m,a,s,minu,h):

    Reloj.__init__(self,s,minu,h)
    Calendario.__init__(self,d,m,a)

def avanzar(self):

    hora_previa= self.__hora
    Reloj.tic(self)
    if self.__hora < hora_previa:
        self.avanzar()

def __str__(self):

     return Calendario.__str__(self) +","+ Reloj.__str__(self)

3 个答案:

答案 0 :(得分:1)

您的AttributeError与您正在使用的属性名称有关。当您使用两个下划线为属性名称添加前缀时,会调用Python的名称重整系统。它将名称从__Foo转换为_SomeClass__Foo(如果代码位于SomeClass类中)。它旨在帮助您编写mixin和代理类,而不必担心无意的名称冲突。

除非您确实需要,否则不应使用该功能。如果要将属性设置为私有,则将属性重命名为仅使用单个下划线。或者只是给他们公开名称,不要试图隐藏实现细节。

您没有显示您正在使用的Contador类型的代码。如果它不是一个花哨的描述符或其他东西,当你将它的实例分配给Reloj中的类变量时,你可能会错误地使用它。您可能希望这些属性是实例变量。我建议你这样做:

class Reloj(object):

    def __init__(self, s, minu, h):

        self._segundo = Contador(0, 60)
        self._minuto = Contador(0, 60)
        self._hora = Contador(0, 24)
        self.set(s, minu, h)

    ...

通过调用set,我们可以避免在__init__中复制其代码,只需要正确设置属性即可。前面的代码可能共享每个Reloj实例之间的时间值。

答案 1 :(得分:1)

不要在变量之前使用__,而不是:

__segundo = Contador(0, 60)
__minuto = Contador(0, 60)
__hora = Contador(0, 24)

你可以用这个:

_segundo = Contador(0, 60)
_minuto = Contador(0, 60)
_hora = Contador(0, 24)

答案 2 :(得分:1)

self.__hora是&#34; privat&#34;。试试这个self._Relog__hora