如何更改 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)
我已经使用 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)