python - 允许从类 B 调用属于类 A 的方法 m()

标签 python class

我有两个类,它们在大多数方面都不相同,但它们共享一个共同的方法。我想从 B 类中调用此方法(属于 A 类):

应该是这样的:

class classA():
    def m():
        pass

class classB():


classB_instance = classB()
classB_instance.m() #here I would like to call a method m() which belongs to class A

我知道可以从classA继承这个方法,但是我不想在这里使用继承,因为classA还有其他与classB无关的方法。

但是,我很乐意使用“受限继承”。我的意思是...我只想继承这个方法,但保留其他方法/属性不变。

这在 Python 中可能吗?

最佳答案

你可以使用混合类:

class MixIn(object):
    def m(self):
        pass

class classA(MixIn): pass

class classB(MixIn): pass

请注意,使用 mixins 对小型项目效果很好,但它们不能很好地扩展到大型项目。参见 Mixins considered harmful (part 1) , (part2) , (part3) , (part4) .这些文章指出了一些问题,包括:

  • 命名空间污染
  • 关注点分离不充分
  • 名称冲突方面的脆弱性
  • MRO 的并发症
  • 设计的不可扩展性
  • 与isa关系的概念混淆

即使 mixin 对于小型项目工作得很好,如果它们不能很好地扩展,那么鼓励使用它们也不是一件好事,因为小型项目可能会成长为大型项目(尽管作者的初衷是好的:-))。

@mgilson 的回答可能更好,因为它的明确性避免了难以追踪/命名空间污染的问题。但它仍然容易受到上述许多其他问题的影响。

因此,或者,使用 polymorphic functions可能适合您的需求:

def m(self): pass

class classA(object): pass
class classB(object): pass

a = classB()
b = classB()
m(a)
m(b)

随着项目的发展,如果 m 的行为取决于其参数的类型,您可以扩展 m 而无需使用 generic functions 更改语法。 (另请参见 PEP443)。

另一种更好的方法是使用 composition instead of inheritance .查看interface wrapper solution例如。

关于python - 允许从类 B 调用属于类 A 的方法 m(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20202559/

相关文章:

python - 我如何获得 blog_post.title 以及构建自定义 SQL 查询的最新评论?

Python Qt+OpenGL 绘图区域错误

java - Android/java 公共(public)类中的 if else 语句

java :Setter Getter and constructor

java - 封装 - 在同一个类中使用 setter/getter ?

python - 在 ubuntu 上使用 anaconda 安装 openCV

python - dtype 对象的累积操作

java - 使用多个类时未定义构造函数

python - 如何使用 miniconda 获得一个完全干净的 python 环境?

java - 我需要帮助将绘画组件添加到类中的框架