我是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
答案 0 :(得分:2)
这就是为什么你不能为你的实例属性使用双下划线前缀。这些名称被破坏了,几乎从未做过你期望的事情。
只需在任何地方使用self.name
和self.owner
。
答案 1 :(得分:2)
使用以下代码替换get_name
的方法Animal
@property
def name(self):
return self.__name
另请记住将toString
的{{1}}更新为
Dog
如果您不熟悉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__
。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())
这是与您的代码相同的代码,但几乎没有更正,只需检查即可