Python 面向对象编程
面向对象的三个基本特性:封装、继承和多态。
-
封装:把客观事物封装成抽象的类,类可以把自己的属性和方法只让可信的对象访问,对不可信的对象进行信息隐藏。
-
继承:继承是一种创建新类的方式,通过继承创建的新类称为子类或派生类,被继承的类称为父类、基类或超类。一个子类可以继承一个或多个父类。
-
多态:多态性是指父类中成员被子类继承之后,可以具有不同的状态或表现行为。
1. 定义类
class Animal(object):
def __init__(self, kind):
self.kind = kind
class是声明类的关键字,这里定义了Animal类,继承了object类,object类是所有类的基类。
2. 创建和使用对象
一个对象的生命周期包括三个阶段:创建、使用和销毁。销毁对象由Python的垃圾回收机制来完成。
类实例化可以创建对象,就是在类名后面加上一对小括号,会调用类的构造方法。
animal = Animal()
Animal()创建了一个对象,并把对象赋值给animal变量,animal是指向对象的一个引用。
3. 类的成员
类的成员包括成员变量、成员方法和属性,成员变量又分为实例变量和类变量,成员方法又分为实例方法、类方法和静态方法。
3-1 实例变量
实例变量就是某个实例对象个体特有的数据,例如你家狗狗的名字、年龄。
class Dog(Animal):
def __init__(self, name, age):
self.name = name # 实例变量
self.age = age # 实例变量
dog = Dog('Bai', 2)
print(dog.name)
构造方法__init__()用来创建和初始化实例变量。第一个参数必须是self,self指向当前实例对象的引用。实例变量通过实例名.实例变量的形式访问。
3-2 类变量
类变量是所有实例对象所共有的数据,例如所有狗狗都喜欢啃骨头。
class Dog(Animal):
gnaw_bone = True # 类变量
def __init__(self, name, age):
self.name = name
self.age = age
print(Dog.gnaw_bone)
类变量要定义在方法之外。类变量通过类名.类变量的形式访问。
3-3 实例方法
方法是在类中定义的函数。实例方法定义时第一个参数是self,将当前实例与该方法绑定起来,使该方法成为实例方法。
class Dog(Animal):
def __init__(self, name, age):
self.name = name
self.age = age
# 实例方法
def grow(self):
self.age += 1
return self.age
dog = Dog('Bai', 2)
print(dog.age)
print(dog.grow())
3-4 类方法
类方法不需要与实例绑定,但需要与类绑定,定义时第一个参数是类的type实例。
class Dog(Animal):
gnaw_bone = True
def __init__(self, name, age):
self.name = name
self.age = age
# 类方法
@classmethod
def gnaw(cls, number):
number = cls.gnaw_bone * number
return number
count = Dog.gnaw(5)
print(count)
3-5 静态方法
静态方法既不与实例绑定,也不与类绑定,只是把类作为它的命名空间。
class Dog(Animal):
def __init__(self, name, age):
self.name = name
self.age = age
# 静态方法
@staticmethod
def eat(food):
return food
print(Dog.eat('bread'))
3-6 私有变量和私有方法
在变量或方法名前加双下画线,就成了私有变量或私有方法。私有变量和私有方法可以在类的内部访问,不能在类的外部访问。
class Dog(Animal):
def __init__(self, name, age):
self.name = name
self.__age = age # 私有变量
# 私有方法
def __grow(self):
self.__age += 1
return self.__age
4. 类的继承
子类继承父类时只是继承父类中公有的成员变量和方法,不能继承私有的成员变量和方法。
class Dog(Animal):
def __init__(self, name, age):
super().__init__(kind) # 调用父类的构造方法
self.name = name
self.age = age
dog = Dog('Taidi', 'CoCo', 1)
print(dog.kind)
重写方法
如果子类方法名与父类方法名相同,而且参数列表也相同,只是方法体不同,那么子类重写了父类的方法。
5. 类的多态
发生多态要有两个前提条件:继承——多态发生一定是子类和父类之间;重写——子类重写了父类的方法。