web-dev-qa-db-ja.com

Python他のクラスのメソッドを使用する

2つのクラスがあり、そのうちの1つに他のクラスで使用したい関数がある場合、関数を書き直す必要がないように何を使用しますか?

29
James

2つのオプションがあります。

  • クラス内のオブジェクトをインスタンス化してから、そのオブジェクトで目的のメソッドを呼び出す
  • 関数をクラスメソッドに変換するには、 @ classmethod を使用します

例:

class A(object):
    def a1(self):
        """ This is an instance method. """
        print "Hello from an instance of A"

    @classmethod
    def a2(cls):
        """ This a classmethod. """
        print "Hello from class A"

class B(object):
    def b1(self):
        print A().a1() # => prints 'Hello from an instance of A'
        print A.a2() # => 'Hello from class A'

または、必要に応じて継承を使用します。

class A(object):
    def a1(self):
        print "Hello from Superclass"

class B(A):
    pass

B().a1() # => prints 'Hello from Superclass'
30
miku

いくつかのアプローチがあります:

  • 継承
  • 委任
  • 超卑​​劣な委任

次の例では、それぞれを使用して、メンバーを出力する関数を共有しています。

継承

class Common(object):
    def __init__(self,x):
        self.x = x
    def sharedMethod(self):
        print self.x

class Alpha(Common):
    def __init__(self):
        Common.__init__(self,"Alpha")

class Bravo(Common):
    def __init__(self):
        Common.__init__(self,"Bravo")

委任

class Common(object):
    def __init__(self,x):
        self.x = x
    def sharedMethod(self):
        print self.x

class Alpha(object):
    def __init__(self):
         self.common = Common("Alpha")
    def sharedMethod(self):
         self.common.sharedMethod()

class Bravo(object):
    def __init__(self):
         self.common = Common("Bravo")
    def sharedMethod(self):
         self.common.sharedMethod()

超卑​​劣な委任
このソリューションは、Pythonメンバー関数について特別なことは何もないという事実に基づいています。最初のパラメーターがクラスのインスタンス。

def commonPrint(self):
    print self.x

class Alpha(object):
    def __init__(self):
        self.x = "Alpha"
    sharedMethod = commonPrint

class Bravo(object):
    def __init__(self):
        self.x = "Bravo"
    sharedMethod = commonPrint

または、委任を実現する同様に卑劣な方法は、呼び出し可能なオブジェクトを使用することです。

class Printable(object):
   def __init__(self,x):
       self.x = x
   def __call__(self):
       print self.x

class Alpha(object):
   def __init__(self):
       self.sharedMethod = Printable("Alpha")

class Bravo(object):
   def __init__(self):
       self.sharedMethod = Printable("Bravo")
23

両方のクラスが継承するクラスを作成します。

継承は複数あるため、すでに親がいる場合は問題ありません。

class master ():
    def stuff (self):
        pass

class first (master):
    pass


class second (master):
    pass


ichi=first()
ni=second()

ichi.stuff()
ni.stuff()
6
o0'.