b
意味的にははありません。です。
def f
が依存する唯一のことは、a_instance
が呼び出し可能な属性.foo
を生成するということです。完全停止。
A()
またはAChild()
、さらにはMagicMock
を渡すかどうかは関係ありません。
これは、「ダックタイピング」という語句の意味です。考えてみましょう:
def is_a_duck(duck_candidate):
duck_candidate.looks_like_a_duck()
duck_candidate.walks_like_a_duck()
duck_candidate.quacks_like_a_duck()
print('This is a duck')
return True
あなたが.looks_like_a_duck()
何か、と.walks_like_a_duck()
を作成し、.quacks_like_a_duck()
場合には、限り、我々はコンサートだとして、それはアヒルです!
class Person:
def looks_like_a_duck(self): pass
def walks_like_a_duck(self): pass
def quacks_like_a_duck(self): pass
class FakeDuck:
def looks_like_a_duck(self): pass
def walks_like_a_duck(self): pass
def quacks_like_a_duck(self): print('Quack quack quack')
def funcy_duck():
funcy_duck.looks_like_a_duck = lambda: None
funcy_duck.walks_like_a_duck = lambda: None
funcy_duck.quacks_like_a_duck = lambda: None
return funcy_duck
print(is_a_duck(Person())
print(is_a_duck(FakeDuck())
try:
print(is_a_duck(funcy_duck))
except AttributeError:
print('not a duck yet')
funcy_duck()
print(is_a_duck(funcy_duck))
これらはすべてアヒルです - それはあなたがducks.py
、または別のファイルでそれらを定義した場合は問題、あるいは漬物としてそれらをダンプし、後でそれらをロードしません。私たちの機能に関しては、彼らはすべて鴨です。意味論に依存するものは何もありませんが、私たちの議論が持つ属性や振る舞いは何ですか。
モジュールaを直接使用していない場合は、モジュールaをインポートしないでください。あなたのコードでは、あるクラスのインスタンスが必要です。自分の方法が何をしているかに基づいてモジュールaを直接参照することはできません。したがって、「輸入」は無意味です。 – idjaw
これが便利なのは、タイプヒントを行う場合だけです: 'def f(a_instance:a.A)' – acushner