python方法覆盖多重继承和实例化

时间:2017-09-13 12:26:29

标签: python inheritance multiple-inheritance

这是我的代码 - 我的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"]

3 个答案:

答案 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 compositionmultiple 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

对于那些真实的名字仍然没有意义,但是你告诉他们这些名字都是假名,所以它就可以了。