这是我的代码 - 我的base_file.py
class modify_file(object):
def modify_file_delete_obj():
print "modify file here"
def modify_file_add_attributes():
print "modify file here"
return ["data"]
class task_list(object):
modify_file_instance = modify_file() #problem part when accessing from project1.py
def check_topology():
data = modify_file_instance.modify_file_add_attributes()
#use this data further in this method
def check_particles():
print "check for particles"
project1.py文件
import base_file as base_file
class project1(base_file.modify_file,base_file.task_list):
#overriding method of modify_file class
def modify_file_add_attributes(self):
print "different attributes to modify"
return ["different data"]
这个想法是为大多数项目运行base_file.py,并在需要时运行特定于项目的项目。 但是当我运行方法时
"check_topology" from project1.py
modify_file类是从base_file.py而不是project1.py
派生的So the output is still ["data"] not ["different data"]
答案 0 :(得分:0)
如果要正确使用继承,请定义一个基类Pet
,它提供了一种被特定类型的宠物覆盖的方法。
class Pet(object):
def talk(self):
pass
class Cat(Pet):
def talk(self):
return "meow"
class Dog(Pet):
def talk(self):
return "woof"
pets = [Cat(), Dog(), Cat()]
for p in pets:
print(p.talk())
# Outputs
# meow
# woof
# meow
(我将Pet.talk
应该做的事情(如果有的话)作为另一个问题的话题。)
答案 1 :(得分:0)
您正在将object composition与multiple inheritance混合在一起。
div {
width: 200px;
padding: 10px;
background-color: yellow;
border: 1px solid black;
}
div.first {
background: steelblue;
transform: matrix(3, 0, 0, 3, 300, 100); /* Standard syntax */
}
div.second {
background: orange;
transform: matrix(3, 0, 0, 3, 300, 250); /* Standard syntax */
}
.fixed {
position:fixed;
}
类在创建task_list
类的内部实例时使用对象组合。但是这里存在一个问题,即您将其创建为类属性,这意味着它将由modify_file
的所有实例共享。它应该是在task_list
方法中创建的实例属性:
__init__
class task_list(object):
def __init__(self):
super(task_list, self).__init__()
self.modify_file_instance = modify_file()
def check_topology(self):
data = self.modify_file_instance.modify_file_add_attributes()
类使用多重继承,实际上它应该使用单继承。它是一种project1
,因此继承task_list
以及是没有意义的。相反,它应该创建它自己的内部子类modify_file
- 即使用对象组合,就像modify_file
类一样:
task_list
现在您拥有一致的界面。因此,当# custom modify_file sub-class to override methods
class project1_modify_file(base_file.modify_file):
def modify_file_add_attributes(self):
print "different attributes to modify"
return ["different data"]
class project1(base_file.task_list):
def __init__(self):
super(project1, self).__init__()
self.modify_file_instance = project1_modify_file()
被调用时,它将依次调用project1.check_topology()
(通过继承),然后访问task_list.check_topology()
(通过合成):
self.modify_file_instance
答案 2 :(得分:-1)
在您的dog
课程中,您正在重新构建cat
的实例,此实例(以及cat
类型)不知道它们是由{{在其他地方继承的1}}。
所以你可以自然地尝试:
pets
对于那些真实的名字仍然没有意义,但是你告诉他们这些名字都是假名,所以它就可以了。