Python模块import
应该是它们在语义上依赖的模块吗?
例如:
模块a
:
class A(object):
...
def foo(self):
...
模块b
:
import a
def f(a_instance):
a_instance.foo()
...
严格来说,模块b
的第一行是不必要的,但是我想知道它在Python中是否被认为是好的形式?
答案 0 :(得分:5)
b
在语义上取决于 nothing 。
从字面上看,def f
唯一依赖的是a_instance
生成一个可调用的属性.foo
。完全停止。
如果您传入A()
或AChild()
甚至是MagicMock
,这无关紧要。
这就是短语" duck typing"手段。考虑:
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
或不同的文件中定义它们,或者甚至将它们作为泡菜转储并稍后加载它们并不重要。就我们的职能而言,他们都是鸭子。除了我们的论证所具有的属性和行为之外,没有任何语义依赖。