python 是面向对象语言, 因此它具有面向对象封装, 继承, 多态等特点.
简单了解下面向对象术语
类: 具有相同属性和方法的对象的集合, 对象是实例化后的类.
方法: 类中定义的函数, 使用 def 定义, 同时参数里面默认要带上 self
类变量: 类变量在整个实例化的对象中是公用的. 类变量定义在类中且在函数体之外. 类变量通常不作为实例变量使用.
数据成员: 类变量或者实例变量用于处理类及其实例对象的相关的数据.
方法重写: 如果从父类继承的方法不能满足子类的需求, 可以对其进行改写, 这个过程叫方法的覆盖(override), 也称为方法的重写.
局部变量: 定义在方法中的变量, 只作用于当前实例的类.
实例变量: 在类的声明中, 属性是用变量来表示的, 这种变量就称为实例变量, 实例变量就是一个用 self 修饰的变量.
继承: 即一个派生类 (derived class) 继承基类 (base class) 的字段和方法. 继承也允许把一个派生类的对象作为一个基类对象对待. 例如, 有这样一个设计: 一个 Dog 类型的对象派生自 Animal 类, 这是模拟 "是一个(is-a)" 关系(例图, Dog 是一个 Animal).
实例化: 创建一个类的实例, 类的具体对象.
对象: 通过类定义的数据结构实例. 对象包括两个数据成员 (类变量和实例变量) 和方法.
python 中定义类格式如下:
class ClassName():
def 方法名(self):
pass
类名一般建议使用驼峰命名方式, 即: 每个单词首字母大写.
- class Person(object):
- name1 = 'admin' #name1 类变量
- __age = '18' #私有变量, 以__开头, 私有属性在类外部无法直接进行访问
- def __init__(self,age,sex): #age sex 为实例变量
- self.name = self.name1
- self.age = age
- self.sex = sex
- def info(self):
- print('你的名字是 {0}, 年龄{1} 岁, 性别是{2}'.format(self.name,self.age,self.sex))
- if __name__ == '__main__':
- p = Person('20','男')
- p.info()
python 继承, 允许同时继承多个父类, 在调用方法时, 先寻找子类如果没有则寻找父类从左到右, 再从下到上找
- class Person():
- def __init__(self,name):
- self.name = name
- def show(self):
- print('你的名字是{0}'.format(self.name))
- def aa(self):
- print('我是父类 Person')
- class PA():
- def __init__(self,name):
- self.name = name
- def show(self):
- print('PA: 你的名字是{0}'.format(self.name))
- def aa(self):
- print('我是父类 PA')
- def bb(self):
- print('我是类 PA 中的 bb 方法')
- class PsersonA(Person):
- def __init__(self,name,age):
- Person.__init__(self,name)
- self.age = age
- #
- # def show(self):
- # print('你的名字是 {0}, 年龄{1} 岁'.format(self.name, self.age))
- class PsersonB(PA):
- def __init__(self,name,sex):
- super(PsersonB,self).__init__(name)
- self.sex = sex
- def show(self):
- print('你的名字是{0}, 性别是{1}'.format(self.name, self.sex))
- def info(self):
- print('我是类 PsersonB')
- class C(PsersonA,PsersonB):
- def __init__(self,name,age,sex):
- PsersonA.__init__(self,name,age)
- PsersonB.__init__(self, name, sex)
- def info(self):
- print('我是子类 C')
- if __name__ == '__main__':
- p = C('ADMIN','20','男')
- p.info() #子类与父类存在相同方法, 优先使用子类
- p.show() #子类方法不存在, 则从父类中寻找, 顺序 从左到右, 从下到上, 就先寻找第一个父类, 如果没有继续找第一个父类的父类, 如果还没有找第二个父类
- p.aa() #方法 aa,C 类中没有, 找第一个父类 PsersonA 中也没有, 找 PsersonA 的父类 Person 有方法 aa
- p.bb()
类的专有方法:
__init__ : 构造函数, 在生成对象时调用
__del__ : 析构函数, 释放对象时使用
__call__: 函数调用, 对象后面(), 触发调用
__str__: 改变对象的字符串显示
__doc__: 类的描述信息
- class P():
- '''类描述信息嘀嗒'''
- def __init__(self):
- print('我是构造函数, 在生成对象时时执行')
- def __del__(self):
- print('我是虚构函数, 最后执行')
- def info(self):
- print('个人信息')
- def __call__(self, *args, **kwargs):
- print('对象后面(), 触发调用')
- self.info()
- def __str__(self):
- return '改变对象字符串显示'
- if __name__ == '__main__':
- obj = P()
- print(obj())
- print(obj.__doc__)
- print(obj)
在类中方法有普通方法, 静态方法, 特性方法, 类方法等
- class P(object):
- def info(self):
- print('我是普通方法')
- @property #加 property 装饰器, 为特性方法, 在调用函数时无需加()
- def info1(self):
- print('我是特性方法')
- @staticmethod #加 staticmethod 装饰器, 为静态方法, 可由类名直接调用
- def info2():
- print('我是静态方法')
- @classmethod #加 classmethod 装饰器, 为静态方法, 属于类, 可由类直接调用
- def info3(cls):
- print('我是类方法')
- if __name__ == '__main__':
- obj = P()
- obj.info()
- obj.info1
- P.info2()
- P.info3()
来源: http://www.bubuko.com/infodetail-3382335.html