面向对象编程
面向对象编程的三个基础概念是数据封装(类)、继承和多态,在这三个记住概念的基础上,进一步扩展出更加高级的多重继承、定制类和元类等概念,这些概念和相关的功能使得python称为一种强大的面向对象的高级动态语言。
数据封装
面向对象编程中最重要的概念就是类和实例,类是对象的抽象的概念,而实例是对象的具象的结果。python中通过class关键字定义一个类,
class person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def show(self):
print("name: %s, age: %s" % (self.name, self.age))
laowang = person("laowang", 20)
laowang .show()
___________
输出:
name: laowang , age: 20
在类中为了代码安全性的要求,有些属性和方法不应该被外部直接获取到,需要对这些属性或方法设置访问限制,这一点和其他面向对象编程语言是一样的,即属性和方法有private
和public
的区分。在python不使用这两个关键字来设置访问权限,而是直接在属性名或函数名之前添加两个下划线__
来表示这个属性是私有的属性,不允许外部直接修改,如果需要修改该属性,可以增加一个专门的函数用来修改该属性。
class person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
def show(self):
print("name: %s, age: %s" % (self.__name, self.__age))
def set_age(self, age):
self.__age = age
qq = person("laowang", 20)
qq.show()
qq.set_age(90)
qq.show()
____________
输出:
name: laowang, age: 20
name: laowang, age: 90
设置的访问限制的属性无法通过类似qq.__age
的形式直接访问,因为在解释器中它的名称已经被改变为qq._person__age
,通过这一变量可以访问到该属性,但是并不建议这么做,因为不同版本的解释器的修改方法可能不一致,这会导致代码的不兼容,同时这么做也是不安全的。
如果在设置的访问限制之后,再直接使用__age
强制的修改属性的内容,此时其实是新建了一个类的属性,原先类中的__age
其实并未改变。
class person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
def show(self):
print("name: %s, age: %s" % (self.__name, self.__age))
def set_age(self, age):
self.__age = age
qq = person("laowang", 20)
qq.show()
qq.__age = 50
qq.__age
qq.show()
qq.set_age(90)
qq.show()
————————————————————
输出:
name: laowang, age: 20
name: laowang, age: 20
name: laowang, age: 90
继承和多态
当我们新建一个类时,可以从一个现有的类上继承,这个新建的类被称为子类,这个被继承的类被称为子类的基类、父类或超类。
继承可以获得父类的全部功能,包括属性和方法,同时可以在此基础上进行添加新的属性和方法,或者重写原有的方法。同时,由于继承存在层层传递的关系,子类的实例,也是父类的实例,也是父类的父类的实例,以此类推,直到最上层的那个类,这也是为什么子类可以使用父类以及父类的父类中所定义的属性和方法,这也是由继承所导致的多态性,一个类可以具有包括其自身及所有父类的。
同时在使用子类,一定是先使用子类所定义的方法和属性,如果没有,才会去依次向上追溯寻找可用的属性或方法,如果直到最终的根类object
都没有,才会爆错。
#!/usr/bin/python
# -*- encoding:utf-8 -*-
class person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
def show(self):
print("name: %s, age: %s" % (self.__name, self.__age))
def set_age