为了账号安全,请及时绑定邮箱和手机立即绑定

将函数从一个类传递到另一个类中没有一个继承自另一个类时,是否有“最佳实践”?

将函数从一个类传递到另一个类中没有一个继承自另一个类时,是否有“最佳实践”?

慕仙森 2022-05-24 09:18:04
我有两个不相互继承的类,但一个确实需要从另一个调用函数。我使用浴室类和淋浴类做了一个简化的例子。第一个方法将函数作为一个 init 参数传入。第二个在第一个类创建后覆盖一个变量。方法一这似乎是执行此操作的正确方法,但是必须为每个Shower1实例传递函数可能很乏味。对于也需要该函数的每个其他类也必须这样做;比如Sink、Rug、Toliet等……如果需要将多个函数传递给每个函数,那就更加繁琐了。class Bathroom1:    def __init__(self):        self.items = []    def AddToItems(self, item):        self.items.append(item)        print('br1', str(self.items))class Shower1:    def __init__(self, AddToItems):        self.AddToItems = AddToItems        self.AddToItems('Shower1')bathroom1 = Bathroom1()shower1= Shower1(bathroom1.AddToItems)方法二这得到与方法 1 相同的结果,我相信当需要传入多个类或多个方法时,这也不会那么乏味。不必为创建的每个新对象传递参数,而只需做一次。但我不确定这是否被认为是“正确的”,或者它是否会导致其他问题。class Bathroom2:    def __init__(self):        self.items = []    def AddToItems(self, item):        self.items.append(item)        print('br2', str(self.items))class Shower2:    AddToItems = None    def __init__(self):        self.AddToItems('Shower2')bathroom2 = Bathroom2()Shower2.AddToItems = bathroom2.AddToItemsshower2 = Shower2()我可以使用继承来更轻松地添加其他类,如Sink、Rug等......继承示例:class Bathroom3:    def __init__(self):        self.items = []    def AddToItems(self, item):        self.items.append(item)        print('br3', str(self.items))class BathroomItem:    AddToItems = Noneclass Shower3(BathroomItem):    def __init__(self):        self.AddToItems('Shower3')class Sink(BathroomItem):    def __init__(self):        self.AddToItems('Sink')bathroom3 = Bathroom3()BathroomItem.AddToItems = bathroom3.AddToItemsshower3 = Shower3()sink = Sink()有推荐的方法吗?
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

如果这里的目标是向浴室添加物品,为什么不在创建新对象时传递浴室实例呢?


class Bathroom:

    def __init__(self):

        self.items = []


    def AddToItems(self, item):

        self.items.append(item)

        print('br', str(self.items))


class BathroomItem:

    def __init__(self, bathroom):

        bathroom.AddToItems(self)


br = Bathroom()  # bathroom.items == []

item1 = BathroomItem(br)  # bathroom.items == [item1]

item2 = BathroomItem(br)  # bathroom.items == [item1, item2]


查看完整回答
反对 回复 2022-05-24
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信