看起来基类构造函数未初始化

时间:2016-09-28 09:54:45

标签: python python-3.x oop

我是python的新手,在这里尝试oops编程。 我在派生类中初始化基类构造函数,但是当尝试在基类中打印它的属性时,它给出了错误 var arr = []; this.store.each(function (record) { arr.push(this.store.getProxy().getWriter().getRecordData(record)) });

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^([^\.|/]+)$ $1.php [NC,L]

我在这里做错了什么?我尝试调用object has no attribute也是一个getter函数而不是import random import os import sys class Animal: __name ="" def __init__(self,name): self.__name = name def toString(self): return "{} is the animal name".format(self.__name) def get_name(self): return self.__name cat = Animal("natasha") print (cat.toString()) class Dog(Animal): __owner = "" def __init__(self,name,owner): self.__owner= owner #Animal.__init__(self,name) super(Dog, self).__init__(name) def toString(self): return "{} is Animal. And owner is: {}".format(self.__name,self.__owner) rocky = Dog("rocky","Ronchi") print (rocky.toString()) 但是这也没有用。我正在研究python3.4

4 个答案:

答案 0 :(得分:2)

这就是为什么你不能为你的实例属性使用双下划线前缀。这些名称被破坏了,几乎从未做过你期望的事情。

只需在任何地方使用self.nameself.owner

答案 1 :(得分:2)

使用以下代码替换get_name的方法Animal

@property
def name(self):
    return self.__name

另请记住将toString的{​​{1}}更新为

Dog

如果您不熟悉Python,我认为值得指出的一些事情:

  • 关于getter和setter,Python使用def toString(self): return "{} is Animal. And owner is: {}".format(self.name,self.__owner) @property装饰器而不是Java等语言中的@property.setter / get_something约定。
  • 使用set_something也不是非常Pythonic。首先,方法名称应该在toString中。其次,使用签名snake_case定义方法并返回def __str__(self)。然后,您就可以执行str而无需像print(rocky)那样拨打__str__
  • 在Python 3中使用toString的正确方法是super,没有传递任何参数(https://docs.python.org/3/library/functions.html#super)。

答案 2 :(得分:0)

以双下划线开头的变量称为私有。它们被破坏,因此它们不能用于子类。使用CPython 3.5,您只需使用以下命令进行确认:

>>> rocky.__dict__
{'_Animal__name': 'rocky', '_Dog__owner': 'Ronchi'}
>>>

Dog班级调用时,self.__name会搜索_Dog__name属性,但无法找到它。

有两种常见方法可以处理它:

  • 不使用私有变量,而只使用隐藏变量,这只是使用简单的下划线前缀。该变量不会由帮助显示,但不会被修改,并且可以从子类
  • 访问
  • 使用基类中的getter:

    def toString(self):
        return "{} is Animal. And owner is: {}".format(self.get_name(),self.__owner)
    

    这正确地给出了:

    >>> print(rocky.toString())
    rocky is Animal. And owner is: Ronchi
    >>> 
    

答案 3 :(得分:0)

实际上,如果您知道抽象的概念,那么您已经在父类中将名称作为私钥提供了。

import random
import os
import sys
class Animal:

__name =""
def __init__(self,name):
    self._name = name
def toString(self):
    return "{} is the animal name".format(self._name)
def get_name(self):
    return self._name
cat = Animal("natasha")
print (cat.toString())
class Dog(Animal):
__owner = ""
def __init__(self,owner,*args):
    super(Dog, self).__init__(*args)
    self.__owner= owner
def String(self):
    return "{} is Animal. And owner is: {}".format(self._name,self.__owner)
rocky = Dog("rocky","Ronchi")
print (rocky.String())

这是与您的代码相同的代码,但几乎没有更正,只需检查即可