如何在Python中更改类对象的父类实例/属性?

时间:2018-07-27 05:58:56

标签: python class oop subclass

我已经成功地使用Python数月(甚至更长)使用Excel进行批处理脚本,但是我仍然还不太了解面向对象的编程。

让我说下面的代码,除了人/家庭(比方说50个家庭)和更多的家庭属性,而不仅仅是姓,地址和家庭大小(比方说10个属性)。< / p>

class Family():
    def __init__(self, family_id, last_name, address, family_size):  
        self.family_id = family_id  
        self.last_name = last_name  
        self.address = address
        self.family_size = family_size  

class Person(Family):
    def __init___(self, family_id, last_name, address, family_size, person_id, first_name,  
                  middle_name):
        super().__init__(id, last_name, address, family_size)
        self.person_id = person_id
        self.first_name = first_name
        self.middle_name = middle_name

jones1 = Family(2, "Jones", "456 Main Street", 1)
bob1 = Person(1, "Smith", "123 Main Street", 1, 1, "Bob", "James")    
alice1 = Person(2, "Jones", "456 Main Street", 1, 2, "Alice", "Mary")

现在让我们实例化两个名为Bob和Alice的对象(人)。他们来自两个不同的家庭。但是,假设我要鲍勃和爱丽丝结婚,这意味着他们中的一个放弃了自己的家庭,并加入了另一个的家庭。

如何执行此操作(从代码角度而言)?我知道我可以输入:

 bob1.last_name = "Jones"  

现在Bob有了Alice的姓氏。但是,必须有比手动覆盖每个类属性更简单的方法。我觉得我缺少关于家庭对象(jones1)的一些简单信息,但是我如何让Bob成为Jones家庭的一部分?

编辑:为了澄清下降的投票,这是一个练习,与我正在从事的工作没有直接关系。我是不了解OOP和堆栈溢出的新手。如果您对我如何才能更好地表达我的问题有任何意见,除了发布时实际代码错误较少之外,请在评论中告知我。

2 个答案:

答案 0 :(得分:1)

继承是一个是一个关系。一个人不是一个家庭,而是一个家庭,因此这里有继承权。

两个不同的人可以属于同一个家庭,这不能通过继承实现=>您需要1-n父子类型关系。一种常见的方式是在家庭中包括一个容器(例如集合或列表),和/或亲自提及家庭:

class Family:
    def __init__(self, id, last_name, address):  
        self.id = id  
        self.last_name = last_name  
        self.address = address
        self.family_members = set()
    def add(self, member):
        member.family = self
        self.family_members.add(member)
    def remove(self, member):
        member.family = self
        self.family_members.remove(member)

class Person:
    def __init__(self, first_name, middle_name, family):
        self.first_name = first_name
        self.middle_name = middle_name
        family.add(self)
    def change_family(self, new_family):
        self.family.remove(self)
        new_family.add(self)

我为人添加了change_family方法,这是爱丽丝嫁给鲍勃所需要的...


经典的继承示例是动物,猫和狗。

一只猫是动物(狗也是狗),两只不同的猫是动物...

答案 1 :(得分:1)

首先,我对您的代码有一些建议。

  • 最好使用从对象class Foo(object)继承的新样式类。

  • 对于新样式类,请使用super(ChildClass, self).__init__()覆盖init方法。

  • 家庭不应该是基类,而应该是Person所属的另一个类。基类的含义是子类是基类的子类型。显然,人不是家庭的子类型。我们可以说狗是动物的一种亚型。

我对您的代码进行了一些调整。您可能需要根据自己的想法进行修改。

class Family(object):
    def __init__(self, family_id, last_name, address, family_size):  
        self.family_id = family_id  
        self.last_name = last_name  
        self.address = address
        self.family_size = family_size  

class Person(object):
    def __init___(self, family_id, last_name, address, family_size, person_id, first_name,  
              middle_name):
        self.id = ...
        self.last_name = ...
        ...
        self.person_id = person_id
        self.first_name = first_name
        self.middle_name = middle_name

    def join_family(self, new_family):
        self.family.family_size -= 1
        self.family = new_family
        new_family.family_size += 1

    def marry_to(self, person):
        self.join_family(person.family)

family_smith = Family(1, "Smith", "789 Main Street", 1)
family_jones1 = Family(2, "Jones", "456 Main Street", 1)
bob1 = Person(1, "Smith", "123 Main Street", 1, 1, "Bob", "James")    
alice1 = Person(2, "Jones", "456 Main Street", 1, 2, "Alice", "Mary")

然后鲍勃结婚并加入了爱丽丝的家人

bob1.marry_to(alice1)

bob1.join_family(family_jones1)