作者:玉树【林】风
欢迎转载,也请保留这段声明。
继承
在现实世界中,不同的类之间可能存在某种从属关系。
例如:猫和狗都属于哺乳动物,猫和狗都有2只眼睛、4个脚、1个尾巴,也能够吃饭、睡觉、发出叫声。只是猫的叫声和狗的叫声不同。
那么我们先定义一个哺乳动物类。
# encoding=utf-8
class Mammal:
eyes = 2
legs = 4
tail = 1
# 吃东西
def eat(self):
print('eating!')
# 睡觉
def sleep(self):
print('sleeping!')
# 发出叫声
def cry(self):
pass
这里可以发现,猫和狗除cry的方法不同外,其他属性和行为都相同,那么我们利用继承的方式,就不需要重新定义这些相同的属性和方法了。
class Dog(Mammal):
pass
class Cat(Mammal):
pass
Tom = Cat()
Odd = Dog()
print('Tom has %d eyes' % Tom.eyes)
print('Odd has %d eyes' % Odd.eyes)
Tom.eat()
Odd.eat()
输出为
Tom has 2 eyes
Odd has 2 eyes
eating!
eating!
可以发现,Mammal的子类Cat和Dog都可以调用父类的方法,并获得父类的属性。
方法重写
刚刚我们新建了Cat类和Dog类,各自集成了Mammal类,分别拥有了哺乳动物的基本属性和行为。但是对于cry这个方法,猫和狗是不一样的。
Mammal类中cry方法体为pass,即方法为空。
我们可以使用方法重新的办法将猫和狗的cry方法进行重写,使猫和狗有各自不同的叫声。
# encoding=utf-8
class Dog(Mammal):
def cry(self):
print('汪汪')
class Cat(Mammal):
def cry(self):
print('喵')
Tom = Cat()
Tom.cry()
Odd = Dog()
Odd.cry()
输出为
喵
汪汪
通过方法重写,我们就使Mammal的子类猫和狗拥有了各自不同的叫声。
私有属性及私有方法
为了类能够被安全的调用,Python提供了一套属性、方法私有的方式,防止类中不对外公开的属性和方法被外部访问。
我们只需要在定义的变量或方法前加2条下滑线(如:__param_name、__func)即可。
# encoding=utf-8
class fruit:
__private_param = '私有属性'
def __private_func(self):
print('私有方法')
f = fruit()
print(f.__private_param)
f.__private_func()
启动后报错,报错信息如下
AttributeError: 'fruit' object has no attribute '__private_param'
如果将第8行代码注释掉,报错信息如下
AttributeError: 'fruit' object has no attribute '__private_func'
当我们将属性或方法定义为私有、通过实例对象的方式就无法直接访问了,只能在类的内部访问。
总结
这节课我们将面向对象的剩余部分讲解完毕,主要内容包括:
类的集成
方法的重写
私有属性和私有方法的使用