【发布时间】:2018-07-27 05:58:55
【问题描述】:
我已经成功使用 Python 在 Excel 中编写批处理脚本几个月了,甚至更长时间,但我仍然没有真正理解面向对象的编程。
假设我有以下代码,除了有更多的人/家庭(比如说,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"
现在 Bob 有了 Alice 的姓氏。但是必须有比手动覆盖每个类属性更简单的方法。我觉得我错过了关于家庭对象 (jones1) 的一些非常简单的事情,但是我如何让 Bob 成为 Jones 家庭的一员?
编辑:为了澄清反对意见,这是一个练习,与我的工作没有直接关系。我不熟悉 OOP 和 Stack Overflow;如果您有任何关于我如何更好地表达我的问题的 cmets,除了发布更少的实际代码错误之外,请在 cmets 中告诉我。
【问题讨论】:
-
class Person(Family)不是一个合理的子类关系——它暗示一个人是一个家庭。你需要组合,而不是子类化。 -
另外,即使忽略
"错字,这段代码也不会运行,并且不清楚它是如何supposed 工作的。您的Person.__init__没有任何它试图传递给super().__init__的变量,然后它尝试使用id,它也没有作为变量。然后,为了更好的衡量标准,您使用错误数量的参数调用构造函数。 -
我在运行中提出了代码,作为我实际使用的简化的理论示例;我没试过运行它。我一直在寻找更多的理论方向,以正确地使用 OOP 实现家庭成员。