Skip to main content
 首页 » 编程设计

python之面向对象编程基础 : inheritance & shadowing (Python)

2025年05月04日10zfyouxi

级别:初级

我正在迈出面向对象编程的第一步。该代码旨在展示方法是如何向上传递的。因此,当我调用 UG.say(person, 'but i like') 时,方法 say 被指示调用类 MITPerson。鉴于 MITPerson 不包含 say 方法,它将把它传递给 Person 类。我认为代码没有任何问题,因为它是讲座的一部分(请参阅下面的源代码)。我认为是我在运行代码时忽略了定义某些东西。不确定是什么。我认为错误消息正在寻找的 UG 实例 作为第一个参数引用 self 但原则上不需要提供,对吗?有什么提示吗?

class Person(object): 
    def __init__(self, family_name, first_name): 
        self.family_name = family_name 
        self.first_name = first_name 
    def familyName(self): 
        return self.family_name 
    def firstName(self): 
        return self.first_name 
    def say(self,toWhom,something): 
        return self.first_name + ' ' + self.family_name + ' says to ' +   toWhom.firstName() + ' ' + toWhom.familyName() + ': ' + something 
 
 
class MITPerson(Person): 
    def __init__(self, familyName, firstName): 
        Person.__init__(self, familyName, firstName) 
 
 
class UG(MITPerson): 
    def __init__(self, familyName, firstName): 
        MITPerson.__init__(self, familyName, firstName) 
        self.year = None 
    def say(self,toWhom,something): 
        return MITPerson.say(self,toWhom,'Excuse me, but ' + something) 
 
 
 
>>> person = Person('Jon', 'Doe') 
>>> person_mit = MITPerson('Quin', 'Eil') 
>>> ug = UG('Dylan', 'Bob') 
>>> UG.say(person, 'but i like') 
 
 
    UG.say(person, 'bla') 
**EDIT (for completeness)**: it should say UG.say(person, 'but i like') #the 'bla' creeped in from a previous test 
TypeError: unbound method say() must be called with UG instance as first argument (got Person instance instead) 

来源:麻省理工学院开放式课件 http://ocw.mit.edu 2008 年秋季计算机科学与编程导论

请您参考如下方法:

您正在调用类而不是实例。

>>> ug = UG('Dylan', 'Bob') 
>>> UG.say(person, 'but i like') 
 
 
UG.say(person, 'bla') 

改为调用实例

>>> ug = UG('Dylan', 'Bob') 
>>> ug.say(person, 'but i like')