面向对象编程
- OOP:Object Oriented Programming
- 程序的基本单元:对象 [ = 数据 + 操作数据的函数] [属性 + 方法]
- 三大特点:数据封装、继承和多态
- OPP中的计算机程序:
一系列命令的集合 —— 一组函数顺序执行。函数化大为小,降低复杂度
一组对象的集合 —— 对象之前互相传递和处理消息
类和实例
- 概念
- 类class:创建实例的抽象的模板
- 实例instance:由类创建的具体“对象”
各实例拥有的数据互相独立、互不影响
- 数据封装
类中声明函数,访问数据 - tips
- class后紧接着类名 —— 大写开头单词Student
- Student(object)表明Student类是从object类继承下来的
- __init__方法,第一个参数永远是self,表示创建的实例本身,绑定各种属性
class Animal(object):
# __init__方法存在时,创建实例不能传入空参数
def __init__(self, name, score):
self.name = name
self.age = age
def get_age(self):
return self.name + 'is'+self.age + 'years old'
- 创建实例时,不能传入空参数,必须传入与__init__方法匹配的参数,self除外
>>> stu = Student('Litter cat',1)
>>> stu.get_grade()
'Litter cat is 1 years old'
访问限制
公有变量public && 私有变量private
class Student(object):
# __init__方法存在时,创建实例不能传入空参数
def __init__(self, name, score):
self.__name = name # 私有变量,外部不可访问或修改
self.score = score # 公有变量,外部可通过stu.score直接访问或修改
def get_name(self): # 私有变量需要调用内部封装的函数get_name()访问变量
return self.__name
def set_name(self, name): # 私有变量需要调用内部封装的函数set_name()修改变量
self.__name = name
- Python中,__xxx__类型为特殊变量,不是private变量
- _xxx_类型为可访问变量,但尽量不要随意访问
集成和多态
子类Subclass 继承 父类|基类|超类:
- 继承:子类获取父类的全部功能
- 多态:子类和父类拥有相同方法时,子类覆盖父类
- 新增子类的“开闭”原则:
对扩展开放:允许新增子类
对修改封闭:不需要修改依赖类型的函数
class Animal(object):
def sleep(self):
print('Animal is sleeping…')
class Dog(Animal)
def sleep(self):
print('Dog is sleeping…')
def run(self):
print('Dog is running…')
class Cat(Animal)
def sleep(self):
print('Cat is sleeping…')
其中dog和cat类都继承于Animal类
>>> ani = Animal()
>>> ani.sleep()
'Animal is sleeping…'
>>> dog = Dog()
>>> dog.sleep()
'Dog is sleeping…'
>>> dog.run()
'Dog is running…'
获取对象信息
- type():判断对象类型
>>> type(1)
<class 'int'>
>>> type(())
<class 'tuple'>
>>> type([])
<class 'list'>
>>> type(None)
<class 'NoneType'>
>>> type('1') = type('abc')
True
>>> type(False) == bool
True
- isinstance():判断继承关系
>>> isinstance((1,2,3),(list,tuple))
True
>>> isinstance([1,2,3],(list,tuple))
True
>>> isinstance(b'a',bytes)
True
>>> isinstance(Students,object)
True
- dir():获取一个对象的所有属性和方法
>>> dir(1)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> dir([])
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
dir()可配合getaddr()、setaddr()及hasaddr(),直接操作一个对象的状态
实例属性和类属性
- 通过实例变量或者self变量可为实例绑定属性
- 类属性,归类所有,实例中属性的更改不会对类中的属性造成影响
>>> class Demo():
name = 'Demo'
>>> d = Demo() # 初始化实例d
>>> d.name # 未赋值前,实例与类共用属性
'Demo'
>>> Demo.name
'Demo'
>>> d.name = 'D'# 实例中属性改变,不影响类中的属性
>>> Demo.name
'Demo'