具有组合的函数参数

时间:2014-06-26 20:23:41

标签: python inheritance

这是来自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()

2 个答案:

答案 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中的是两个不同对象上的两个不同的函数,