一. 面向对象编程
什么是对象?
对象是指现实中的物体或实物。
什么是面向对象?
把一切看成对象(实例),用各种对象之间的关系来描述实物。
对象都有什么特征?
- 对象有很多属性(名词):可以通过实例访问的变量称为属性,如:姓名,性别,年龄等;
- 对象有很多行为(动作):学习,吃饭,睡觉等。
面向对象的最大优势?
每个对象可以管理自己的资源。
二. 什么是类
拥有相同属性,行为的对象分为一组,即为一个类。
语法:
class 类名(继承列表):
'''类文档字符串'''
实例方法定义
类变量定义
类方法定义(@classmethod)
静态方法定义(@staticmethod)
作用:
- 创建一个类;
- 用于描述对象的行为和属性;
- 用于创建此类的一个或多个同类对象(实例)。
说明:
- 继承列表可以省略,省略继承列表表示此类继承自
Object
; - 类名必须为标识符;
- 类名实质是个变量,绑定一个类。
三. 实例方法和实例属性
语法:
class 类名(继承列表):
def 实例方法(self, 形参1, 形参2, ...):
'''方法的文档字符串'''
语句块
作用:
用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为;
说明:
- 实例方法的实质是函数,是定义在类内的函数;
- 实例方法至少有一个形参,第一个形参代表调用这个方法的实例,一般命名为
self
;
实例方法的调用语法:
实例.实例方法名(调用传参)
类名.实例方法名(实例,调用传参)
实例属性:
每个实例可以使用自己的变量,称为实例变量(也叫属性)。
使用语法:
实例.属性名
属性的赋值规则:
首次为属性赋值则创建属性,再次为属性赋值则改变属性的绑定关系;
作用:
记录每个对象自身的数据;
删除属性:
del 对象.属性名
四. 构造函数
构造函数调用表达式:
类名([创建传参列表])
作用:
创建这个类的实例对象,并返回此实例对象的引用关系。
说明:
- 实例有自己的作用域和名字空间,可以为该实例添加实例变量(也叫属性);
- 实例可以调用类方法和实例方法;
- 实例可以访问类变量和实例变量。
五. 初始化方法
作用:
对新创建的对象添加属性等初始化操作;
语法格式:
class 类名(继承列表)
def __init__(self[,形参列表])
语句块
注:[]
里的内容代表可省略。
说明:
- 初始化方法名必须为
__init__
不可改变; - 初始化方法会在构造函数创建实例后自动调用;
- 构造函数的实例将通过
__init__
方法的参数列表传入到__init__
方法中; - 初始化方法内如果需要
return
语句返回,则只能返回None
。
六. 析构方法
语法:
class 类名(继承列表):
def __del__(self):
语句块
作用:
通常用来释放此对象占用的资源;
说明:
析构方法会在对象被销毁时自动调用。
注:Python 语句建议不要在对象销毁时做任何事情,因为对象销毁的时间难以确定。
示例析构方法和初始化方法的使用:
class Car:
def __init__(self, name):
self.name = name
print('汽车', name, '对象被创建')
def __del__(self):
print('汽车', self.name, '对象被销毁')
运行结果:
>> car = Car('BYD E6')
汽车 BYD E6 对象被创建
>> L = list()
>> L.append(car)
>> car
<__main__.Car at 0x2ce812860d0>
>> car = None
>> L[0]
<__main__.Car at 0x2ce812860d0>
七. 预置的实例属性
__dict__
属性:
绑定一个存储此实例自身变量的字典。
__class__
属性:
绑定创建此实例的类(类实例),可以借助此属性来访问创建此实例的类。
八. 用于类的函数
isinstance(obj, class_or_tuple)
:
返回这个对象 obj
是否是某个类的对象,或者某些类中的一个类的对象;如果是则返回 True
,否则返回False
。
type(obj)
:
返回对象的类。
示例 1:
>> assert isinstance(3.14, float)
>> assert isinstance('python', str)
>> class Dog:
... pass
>> dog = Dog()
>> assert isinstance(dog, Dog)
>> assert type([1,2,3]) is list
>> assert [1,2,3].__class__ is list
示例 2:
"""此类用来描述学生信息,要求如下:
1. 为该类添加初始化方法,实现在创建对象时自动设置 姓名 年龄 成绩 属性;
2. 添加 set_score 方法,能为对象修改成绩信息,并限制成绩在 0-100 之间;
3. 添加 show_info 方法打印学生对象的信息。
"""
class Student:
def __init__(self, name, age, score):
"""每当根据student类创建实例时,都将自动运行此方法"""
self.name = name
self.age = age
self.score = score
def set_score(self, score):
"""self实参将自动被传递,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法"""
try:
assert 0 <= score <= 100, '成绩有误,无法修改!'
self.score = score
except AssertionError as err:
print(score, err)
def show_info(self):
print('%s今年%d岁,成绩是:%d' % (self.name, self.age, self.score))
if __name__ == "__main__":
# 传递的参数由 __init__ 方法的形参决定
s1 = Student('mia.li', 22, 99)
s1.show_info()
s1.set_score(100)
s1.show_info()
s1.set_score(200)
s1.show_info()
运行结果: