【问题标题】:How to use define parent object in python using inheritance?如何使用继承在python中定义父对象?
【发布时间】:2018-04-02 03:13:41
【问题描述】:

我希望创建一个带参数的类 System:sysname,temp,N

并创建一个子类 Molecule,它使用继承从 System 获取参数。

class System() :
    def __init__(self,sysname,temp,N):
        self.sysname=sysname
        self.temp=temp
        self.syslist=[]
        self.N=N


class Molecule(System) :
    def __init__(self,name,position,mass,radius):
        self.name=name
        self.position=position
        self.mass=mass
        self.radius=radius
        self.epsilon=1
        self.sigma=1
        self.syslist.append(self)

我可以将 System 的实例设为

System1=System("system1",100,10)
System2=System("system2",120,10)

现在在定义一个分子时,我如何定义它属于哪个系统?

另外,请告诉我的类定义是否还有其他问题

【问题讨论】:

    标签: python python-2.7 class oop inheritance


    【解决方案1】:

    每个分子实例将具有系统的所有属性,与其他系统实例无关。您混淆了对象的实例和定义。

    【讨论】:

    • 假设我有 2 个系统,System1 和 System2 以及 2 个分子 mol1 和 mol2。那么我如何定义一个分子属于哪个系统>
    • 类之间的继承模型关系“扩展a”。您正在尝试对“具有”进行建模,因此在我看来,您的分子实例应该是系统实例的属性,而不是分子类是系统的子类
    • 每个分子都有自己的位置等属性,但同一系统中的分子即使没有位置也可以具有相同的温度。绝对是一个扩展
    • @progmatico 的回答是正确的,它没有利用继承
    • 该解决方案并不完全正确,因为我不能只调用分子。临时,但是按功能定义模块的系统解决了我的问题
    【解决方案2】:

    也许你的分子属于一个系统并且不从它继承(你说的是一个错误的解决方案,但你没有根据类关系准确解释你的问题)。

    如果是这种情况,您可以将系统添加为分子的属性。

    class Molecule:
        def __init__(self, system):
            self.system = system
            ...
    

    然后你写

    sys1 = System()
    mol1 = Molecule(sys1)
    

    编辑:

    您只需添加所需的参数。您还可以根据您的意图选择哪个类将保留对其他类的引用。您保留在班级内的列表可能会更好地保留在外面(或不保留),请参阅下面的代码。我有一个系统列表。每个系统都有一个分子列表。 分子不知道他们的系统(他们需要知道吗?他们的系统知道他们;我的第一个例子是相反的,分子知道他们的系统,这就是为什么你需要通过传递他们的系统引用来创建它们,连同你的参数)。在这种情况下,不需要。

    class System:
        def __init__(self, name,temp,N):
            self.molecules = [] # list with the system molecules
            self.name = name
            self.temp=temp
            self.N=N
    
        def add_molecule(self, molecule):
            self.molecules.append(molecule)
    
        def add_molecules(self, molecule_list):
            self.molecules.extend(molecule_list)
    
    class Molecule:
       def __init__(self, name, position, mass, radius):
           self.name=name
           self.position=position
           self.mass=mass
           self.radius=radius
           self.epsilon=1
           self.sigma=1
    
    system_list = []
    
    system1 = System("system1",100,10)
    system2 = System("system2",120,10)
    
    system_list.extend([system1, system2])
    
    # example
    for system in system_list:
         print(system.name)
    
    print()
    
    # now some molecules for system1, you need to keep references to them,
    # isolated or in list. Each system will know its molecules.
    mol1 = Molecule('H2O', (0,0,0), 18, 200) # your values
    mol2 = Molecule('CO2', (10,10,10), 44, 300)
    mol3 = Molecule('O3', (10,10,10), 18*3, 600)
    
    system1.add_molecule(mol1) # add molecules to a system
    system2.add_molecules([mol2, mol3])
    
    
    # example
    for system in system_list:
        print(system.name)
        for molecule in system.molecules:
            print(molecule.name)
    
    print()
    
    if mol1 in system1.molecules:
        print('Found water here!')
    

    【讨论】:

    • 每个分子都属于某个系统。如果我使用您所说的方法,我如何传递分子的参数?如果您有更好的解决方案,请尝试根据我的班级结构来回答或建议更改班级结构
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2018-08-06
    • 2015-01-20
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多