在对象的组合结束之后,我们在这里普及一个坑,这个坑很多人都会犯错。仔细观察下面两个程序。
# 程序一: class A: Country = \'中国\' def __init__(self,name,age,country): self.name = name self.age = age def Country(self): return self.Country a = A(\'alex\',23,\'印度\') b = A(\'wusir\',74,\'泰国\') print(a.Country) print(a.Country()) # <bound method A.Country of <__main__.A object at 0x000001965F6FB2C8>> # <bound method A.Country of <__main__.A object at 0x000001965F6FB2C8>> # 程序二: class A: Country = \'中国\' def __init__(self,name,age,country): self.name = name self.age = age def Country1(self): return self.Country a = A(\'alex\',23,\'印度\') b = A(\'wusir\',74,\'泰国\') print(a.Country) print(a.Country1()) \'\'\' 中国 中国 \'\'\' (6)面向对象的三大特性(继承、多态、封装) 1)继承的基础知识在讲解类的继承之前,我们先做一个例子来体验一下继承的特别之处。
1.猫类:名字、吃、喝、睡、爬树
2.狗类:名字、吃、喝、睡、看家
我们没有使用类的继承的时候,我们写的代码如下所示。
class Cat: def __init__(self,name): self.name = name def eat(self): print(f\'{self.name} is eating!\') # print(\'%s is eating!\' %self.name) # print(\'{0} is eating!\'.format(self.name)) def drink(self): print(f\'{self.name} is drinking\') def sleep(self): print(f\'{self.name} is sleeping!\') def climb_tree(self): print(f\'{self.name} is climbing tree\') class Dog: def __init__(self,name): self.name = name def eat(self): print(f\'{self.name} is eating!\') # print(\'%s is eating!\' %self.name) # print(\'{0} is eating!\'.format(self.name)) def drink(self): print(f\'{self.name} is drinking\') def sleep(self): print(f\'{self.name} is sleeping!\') def house_keep(self): print(f\'{self.name} is house keeping\') cat = Cat(\'布偶\') cat.eat() # Cat.eat(cat) cat.drink() cat.sleep() cat.climb_tree() dog = Dog(\'萨摩耶\') dog.eat() dog.drink() dog.sleep() dog.house_keep() \'\'\' 输出的结果为: 布偶 is eating! 布偶 is drinking 布偶 is sleeping! 布偶 is climbing tree 萨摩耶 is eating! 萨摩耶 is drinking 萨摩耶 is sleeping! 萨摩耶 is house keeping \'\'\'上面的代码看起来是十分的累赘,有很多重复的代码,那么我们怎么解决代码的重复的问题呢?这里是我们需要思考的一个问题。需要解决代码的重复问题,使得代码更加的简洁。要解决这个问题,我们需要用到继承的知识才可以解决,所以我们在这里引入了继承的知识。
继承------需要解决代码的重复问题。继承的语法如下所示。
# 单继承 class A: pass class B(A): pass # 多继承 class C: pass class D: pass class E(C,D): pass表示的是B类继承了A类。称为A是父类,B是子类。A也可以叫父类、基类、超类。B是子类、派生类。
在这里我们使用继承的知识来写上面的代码。
# 子类可以使用父类中的:方法和静态变量(静态属性) # 当子类和父类的方法重名的时候,我们只使用子类的方法,而不会去调用父类的方法了。(在java语言中,这个叫做方法的重写) # 子类可以使用父类中的方法,但是也可以重写父类中的方法,同时也可以使用静态变量 class Animal: def __init__(self, name): self.name = name def eat(self): print(f\'{self.name} is eating!\') # print(\'%s is eating!\' %self.name) # print(\'{0} is eating!\'.format(self.name)) def drink(self): print(f\'{self.name} is drinking\') def sleep(self): print(f\'{self.name} is sleeping!\') class Cat(Animal): def eat(self): print(\'%s 吃猫粮\'%self.name) def climb_tree(self): print(f\'{self.name} is climbing tree\') class Dog(Animal): def house_keep(self): print(f\'{self.name} is house keeping\') cat = Cat(\'布偶\') cat.eat() # Cat.eat(cat) 如果子类也有eat方法,那么输出的结果为:布偶 吃猫粮 cat.drink() cat.sleep() cat.climb_tree() dog = Dog(\'萨摩耶\') dog.eat() dog.drink() dog.sleep() dog.house_keep() # 有继承的知识可知,我们写的代码变得更加的整洁,没有重复代码,使得我们写的代码不会冗余。 \'\'\' 继承的输出后的结果为: 布偶 吃猫粮 布偶 is drinking 布偶 is sleeping! 布偶 is climbing tree 萨摩耶 is eating! 萨摩耶 is drinking 萨摩耶 is sleeping! 萨摩耶 is house keeping \'\'\' # 先开辟空间,空间里有一个类指针--》指向类(Cat)的命名空间 # self指向这一块空间。调用init方法,对象在自己开辟的空间中 # 找init方法没有找到,那么就会去类(Cat)的命名空间中找init方法,但是还是 # 没有找到,那么就会去父类(Animal)中找init方法。 # 继承的话,也是有一个类指针指向父类。这样就可以找到父类的方法和静态变量(静态属性)