【发布时间】:2018-07-22 00:57:40
【问题描述】:
我想启动一个子类的多个实例,每个实例都从一个类的特定实例而不是通用类中获取其属性。
例如,如果我有建筑物和房间,则每个房间都需要属于建筑物的特定实例,并采用其属性和方法。
class Building:
def __init__(self, buildingName, location):
self.buildingName = buildingName
self.location = location
# lots more intersting stuff
def Evacuate_Building(self):
# do some stuff
pass
class Room(Building):
def __init__(self, roomName, roomType):
self.roomName = roomName
self.roomType = roomType
# lots more intersting stuff
def Directions(self, Current_Location):
'''do some stuff involving this.roomName and this.location which comes from the specific instance of the class'''
pass
假设我有三座建筑物:“北”、“南”和“西”。
每栋建筑都有自己的房间。
只看北楼,它有房间'N1','N2','N3','N4'。
在我的代码中,我会先检查并启动三个建筑物,然后我会启动房间,以及如何将它们链接回对应的建筑物。
这允许我使用 Directions 方法,该方法利用其父类实例中的属性位置,该属性是该建筑物所独有的,而不是一般值。它还需要能够使用父类 Evacuate_Building 中的方法。
我可以通过每次使用 super(buildingName, location) 或 Building.__ init__(self, buildingName, location) 在更标准的设置中启动房间时传递位置数据来解决这个问题,但这意味着我必须编写每个房间的位置,如果我在建筑物中添加或更改某些内容,如果添加了其他属性,我需要更改每个房间的初始化和初始化代码。
我也可以通过将 Building 的实例作为参数传递给 init 然后将 this.location = building.location 复制出属性,但这也有与上述相同的问题,而且我没有得到方法这边。
我想要一些传递建筑物特定实例的方法,以便房间继承其特定属性和方法。
欢迎任何反馈、建议、批评以及完全不同的方式! 提前致谢!
【问题讨论】:
-
我不认为python有所谓的传递特定的Building实例。相反,您可以创建一个子函数来生成房间,以及一个名为 self.rooms 的属性。还有一个函数change_location,当你调用change_location构建函数时,它会改变他属性下所有房间的位置。
-
一旦建成,
Building几乎不会改变位置,Room几乎不会改变Building@Marcus.Aurelianus -
@Reblochon Masque,基本上我在回答“如果我在大楼中添加或更改某些内容,如果添加了其他属性,我需要更改每个房间的初始化和初始化代码。”,它可以是建筑物的另一个属性。我承认我的位置错了。
-
值得注意的是,你所要求的并不是你想要的,实际上很少是你想要的,但对于某些设计来说并不是不连贯的。它被称为原型继承而不是类继承。并且可以在 Python 中做到这一点,您只需要自己构建整个机制,而不是使用语言中内置的功能。但是除了 JavaScript 之外没有其他主流语言可以进行原型继承,而且 JS 开发人员已经花费了数十年时间尝试将类继承构建到他们的语言中,因为类更适合您的对象模型
-
@Marcus.Aurelianus:听起来正确的解决方案是让建筑物具有属性,并且房间具有对包含它们的建筑物的引用。然后,
__getattr__可用于在Room上进行属性访问,以便从其构建中无缝拉取数据。
标签: python class oop inheritance