Python面向对象三大特性:封装、继承和多态。
1.封装
用自己的话说就是,将内容封装到一个地方,从这个地方调用被封装的内容。
第一步:将内容封装到某处
通过对象直接调用被封装的内容:
#创建类
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
#根据Foo创建对象
obj1 = Foo("suxuefeng",22)
#通过对象obj1直接调用name和age属性,也就是被封装的内容
print(obj1.name)
print(obj1.age)
结果:
suxuefeng
22
通过self间接调用被封装的内容:
#创建类
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
#通过self间接调用被封装的内容
def detail(self):
print(self.name)
print(self.age)
obj1 = Foo("suxuefeng1",25)
obj1.detail()
结果:
suxuefeng1
25
由此可见,对于Python面向对象的封装来说,就是使用构造方法将内容封装到对象中,然后通过对象直接或者self间接调用被封装的内容。
2.继承
继承,顾名思义就是子类可以继承父类的内容
将多个类共有的方法提取到父类中,子类只需要继承父类,不必实现每个方法。
class Animal:
def eat(self):
print("%s chi " %self.name)
def drink(self):
print("%s he " %self.name)
def shit(self):
print("%s la " %self.name)
def pee(self):
print("%s sa " % self.name)
class Cat(Animal):
def __init__(self,name):
self.name = name
self.breed = "猫"
def cry(self):
print("喵喵叫")
class Dog(Animal):
def __init__(self,name):
self.name = name
self.breed = "狗"
def cry(self):
print("汪汪叫")
c1 = Cat("我家的小猫")
c1.eat()
c2 = Cat("你家的小猫")
c2.drink()
d1 = Dog("我家的小狗")
d1.eat()
d2 = Dog("你家的小狗")
d2.shit()
结果:
我家的小猫 chi
你家的小猫 he
我家的小狗 chi
你家的小狗 la
Python中还可以多继承,如果继承了多个类,其寻找的方法有两种,分别是:深度优先和广度优先
当类是经典类时,多继承情况下,按照深度优先方式查找
当类是新式类时,多继承情况下,按照广度优先方式查找
class C1: #C1是经典类
pass
class C2(C1): #C2是经典类
pass
class N1(object): #N1是新式类
pass
class N2(N1): #N2是新式类
pass
3.多态
Python不支持多态,支持函数式编程和面向对象,函数式编程能完成的操作,面向对象都可以,而面向对象能完成的操作,函数式编程不行(函数式编程无法实现面向对象的封装功能)。
一般在Python开发中,全部使用面向对象或者面向对象和函数式混合使用。