Python 允许从类B调用属于类a的方法m()

Python 允许从类B调用属于类a的方法m(),python,class,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继承这个方法,但是

我有两个类,它们在大多数方面都不同,但它们有一个共同的方法。我想从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中可能吗?

您可以使用mixin类:

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

class classA(MixIn): pass

class classB(MixIn): pass
请注意,使用mixin可以很好地用于小型项目,但不能很好地扩展到大型项目。看见这些条款指出了一些问题,包括:

命名空间污染 关注点分离不足 名称冲突的脆弱性 MRO并发症 设计的不可伸缩性 isa关系的概念混淆 即使mixin可以很好地用于小项目,但如果它们不能很好地扩展,鼓励它们的使用也是不好的,因为小项目可能会发展成大项目,尽管作者的意图是好的:-

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

因此,或者,使用以下选项可能适合您的需要:

def m(self): pass

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

a = classB()
b = classB()
m(a)
m(b)
随着项目的发展,如果m的行为取决于其参数的类型,则可以使用see扩展m,而无需更改语法


另一个更好的方法是使用。请参阅示例。

您可以使用mixin类:

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

class classA(MixIn): pass

class classB(MixIn): pass
请注意,使用mixin可以很好地用于小型项目,但不能很好地扩展到大型项目。看见这些条款指出了一些问题,包括:

命名空间污染 关注点分离不足 名称冲突的脆弱性 MRO并发症 设计的不可伸缩性 isa关系的概念混淆 即使mixin可以很好地用于小项目,但如果它们不能很好地扩展,鼓励它们的使用也是不好的,因为小项目可能会发展成大项目,尽管作者的意图是好的:-

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

因此,或者,使用以下选项可能适合您的需要:

def m(self): pass

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

a = classB()
b = classB()
m(a)
m(b)
随着项目的发展,如果m的行为取决于其参数的类型,则可以使用see扩展m,而无需更改语法


另一个更好的方法是使用。请参阅示例。

您可以编写一个常规函数,然后将其放入类命名空间中:

>>> def _m(self):
...     print "Hello World"
... 
>>> class Foo(object):
...     m = _m
... 
>>> class Bar(object):
...     m = _m
... 
>>> Foo().m()
Hello World
>>> Bar().m()
Hello World

这可能不像其他人提出的mixin那样枯燥,但它确实使您的继承树完全独立。

您可以编写一个常规函数,并将其放入类命名空间中:

>>> def _m(self):
...     print "Hello World"
... 
>>> class Foo(object):
...     m = _m
... 
>>> class Bar(object):
...     m = _m
... 
>>> Foo().m()
Hello World
>>> Bar().m()
Hello World

这可能不像其他人提出的mixin那样枯燥,但它确实使您的继承树完全分离。

创建另一个表示有m的类C,并在A和B中继承该类。创建另一个表示有m的类C,并在A和B中继承该类。