如何更改 Python 中 class 对象的父对象 class instance/attributes?

How do I change the parent class instance/attributes of a class object in Python?

我已经使用 Python 成功地使用 Excel 进行了几个月的批处理脚本,如果不是更长的话,但我仍然没有真正理解面向对象的编程。

假设我有以下代码,除了有更多 people/families(假设 50 个家庭)和更多的家庭属性,而不仅仅是姓氏、地址和家庭人数(假设 10属性)。

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 的对象(人)。他们来自两个不同的家庭。但是,假设我希望 Bob 和 Alice 结婚,这意味着他们中的一个放弃了自己的家庭并加入了另一个的家庭。

如何在代码方面做到这一点?我知道我可以输入:

 bob1.last_name = "Jones"  

现在鲍勃有了爱丽丝的姓氏。但是肯定有比手动覆盖每个 class 属性更简单的方法。我觉得我遗漏了一些关于家庭对象 (jones1) 的非常简单的东西,但是如何让 Bob 成为 Jones 家庭的一员?

编辑:为了澄清对否决票的回应,这是一项练习,与我正在从事的工作没有直接关系。我刚开始了解 OOP 和 Stack Overflow;如果您对我如何更好地表达我的问题有任何意见,除了发布实际代码错误较少之外,请在评论中告诉我。

继承是一种是一种关系。一个人不是一个家庭,而是属于一个家庭,所以这里的继承是值得怀疑的。

两个不同的人可以属于同一个家庭,这是继承无法实现的=>需要1-n的父子关系。一种常见的方式是在 family 中包含一个容器(例如一组或一个列表),and/or 对 family in person 的引用:

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 方法添加到 person 中,这是 Alice 嫁给 Bob 所需要的...


经典的继承例子是Animal、Cat和Dog。猫 一种动物(狗也是),两只不同的猫是不同的动物...

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

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

  • 对于新样式 class,使用 super(ChildClass, self).__init__() 覆盖初始化方法。

  • Family 不应该是基础 class,而是 Person 所属的另一个 class。 base class 的意思是子 class 是 base class 的子类型。显然,person 不是 family 的子类型。可以说狗是动物的亚种

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

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)