我已经成功地使用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和堆栈溢出的新手。如果您对我如何才能更好地表达我的问题有任何意见,除了发布时实际代码错误较少之外,请在评论中告知我。
答案 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)