这是来自Learn Python the Hard Way的*组合示例。 在此处找到的示例:Example 44 - 参见示例44.e(在标题“Composition”下)
当我使用电话时:
self.other.implicit()
Child()类是否使用了Other()类中函数定义中的函数参数,还是使用了Child()类中函数定义中的参数?
class Other(object):
def override(self):
print "OTHER override()"
def implicit(self):
print "OTHER implicit()"
def altered(self):
print "OTHER altered()"
class Child(object):
def __init__(self):
self.other = Other()
def implicit(self):
self.other.implicit()
def override(self):
print "CHILD override()"
def altered(self):
print "CHILD, BEFORE OTHER altered()"
self.other.altered()
print "CHILD, AFTER OTHER altered()"
son = Child()
son.implicit()
son.override()
son.altered()
答案 0 :(得分:0)
Child()类是否从Other()类中的函数定义继承函数参数,还是利用Child()类中函数定义中的参数?
它们都有相同的参数 - 一个位置参数(用于self
)。所以,在这方面的功能没有区别。
Child()类是否从Other()类
中的函数定义继承函数参数
Child
不会继承自Other
;它继承自object
,因此不存在任何类型的继承。
答案 1 :(得分:0)
class Other(object):
def __init__(self):
pass
def implicit(self, arg1, arg2):
print arg1
print arg2
class Child(Other):
def __init__(self):
pass
def implicit(self, arg1):
print arg1
Other().implicit(1, 2)
Child().implicit(3)
Output:
1
2
3
如果您正在考虑上述情况,那么参数在python中无关紧要 Python是动态语言,所以你没有像Java这样的规则来覆盖 简单它将匹配参数w.r.t.它正在调用的当前对象方法 如果它无法在当前对象中找到这样的方法,它将查找父对象
class Other(object):
def __init__(self):
pass
def implicit(self, arg1, arg2):
print arg1
print arg2
class Child(Other):
def __init__(self):
pass
Child().implicit(3)
# will raise -> TypeError: implicit() takes exactly 3 arguments (2 given)
# as child does not have implicit method, we will look for method in parent(Other)
# which accepts 3 args (including self)
Child().implicit(1, 2) # this will work
output:
1
2
在你的示例中隐含的其他和隐含在Child中的是两个不同对象上的两个不同的函数,