1.面向对象编程 Object-Oriented Programming
什么是对象: 对象是指现实中的物体或者实体
什么是面向对象: 把一切都看成对象(实例),用各种对象之间的关系来描述事物
对象的特征:
1)对象有很多属性(名词或形容词)
年龄、姓名、性别、漂亮
2)对象有很多行为(动词、动作)
学习、吃饭、睡觉、踢球、鼓掌……
2.什么是类
拥有相同属性和行为的对象分为一组,即为一个类
类是用来描述对象的工具,用类可以创建此类的对象(实例)
3.类和对象示意
车(类) --- 对象:BYD BMW
狗(类) --- 对象:哈士奇 阿拉斯加
int(类)--- 对象:100 200
4.类的创建语句
4.1 语法:
class 类名(继承列表):
'''类文档字符串'''
实例方法定义
类变量定义
类方法定义(@classmethod)
静态方法定义(@staticmethod)
4.2 作用:
·创建一个类
·类用于描述对象的行为和属性
·类用于创建此类的一个或多个对象(实例)
4.3 说明:
类名必须为标识符(与变量名命名相同,建议首字母大写)
类名实质上就是变量,他绑定一个类
5.构造函数
5.1 构造函数的调用表达式:
类名([创建传参列表])
5.2 作用:
创建这个类的实例对象,并返回此实例对象的引用关系
5.3 说明:
实例有自己的作用域和名字空间,可以为该实例添加实例变量(也叫属性)
实例可以调用类方法和实例方法
实例可以访问类变量和实例变量
5.4 示例
class Dog():
'''创建一个Dog类,此类用于描述一种小动物的属性和行为'''
pass
dog1 = Dog() # 创建Dog类的一个实例
print(id(dog1)) # 打印 对象dog1的地址
dog2 = Dog()
print(id(dog2))
lst1 = list() #创建空列表
print(id(lst1))
lst2 = list()
print(id(lst2))
输出如下
140627558661032
140627558661088
140627558662792
140627558662856
6.实例方法
6.1 语法:
class 类名(继承列表):
def 实例方法名(self,形参名1,形参名2,……) # self(自己),如同C++中的‘this’
'方法文档字符串'
语句块
6.2 作用:
用于描述一个东西的行为,让此类型的全部对象都拥有相同的行为
6.3 说明:
实例方法的实质是函数,是定义在类内的函数
实例方法至少有一个形参,第一个形参用来绑定调用这个方法的实例,一般命名为self
6.4 实例方法的调用语句:
实例.实例方法名(调用传参) L.append(6) # 常用
或 # 功能相同
类名.实例方法名(实例,调用传参) list.append(L,6)
6.5 示例
# 此示例示意实例方法的定义和调用
class Dog():
'''创建一个Dog类,此类用于描述一种小动物的属性和行为'''
def eat(self,food):
print(id(self),'号',end='')
print("小狗正在吃",food)
def sleep(self,hour):
print(id(self),'号',end='')
print("小狗睡了%d小时"%hour)
def play(self,obj):
print(id(self),'号',end='')
print("小狗正在玩",obj)
dog1 = Dog() # 创建一个狗对象
dog1.eat('骨头')
dog1.sleep(1)
dog1.play("足球")
print('-'*35)
dog2 = Dog() # 创建一个狗对象
dog2.eat('狗粮')
dog2.sleep(3)
dog2.play("飞盘")
输出如下:
140479668505680 号小狗正在吃 骨头
140479668505680 号小狗睡了1小时
140479668505680 号小狗正在玩 足球
-----------------------------------
140479668505736 号小狗正在吃 狗粮
140479668505736 号小狗睡了3小时
140479668505736 号小狗正在玩 飞盘
7.实例属性 attribute(也叫实例变量)
每个实例可以有自己的变量用来保存对象自己的数据,成为实例变量(也叫属性)
7.1 语法:
实例.属性名
7.2 赋值负责同变量的赋值规则:
1)首次为属性赋值则创建此属性
2)再次为属性赋值则改变属性的绑定关系
7.3 作用:
记录每个对象自身的数据
7.4 示例
# 此示例示意为对象添加实例本来(实例属性)几访问实例变量(实例属性)
# 全局变量一共三个: Dog(),dog1,dog2
# 实例对象是依附于对象的
class Dog():
def eat(self,food):
print(self.color,"的",self.kinds,'正在吃',food)
self.last_food = food # 记录吃过食物
def show_last_food(self):
print(self.color,'的',self.kinds,"上次吃的是",self.last_food)
dog1 = Dog()
dog1.kinds = '京巴' # 添加实例属性
dog1.color = '白色' # 添加
dog1.color = '黄色' # 修改实例属性的而绑定关系
dog2 = Dog() #另一个对象
dog2.kinds = '藏獒'
dog2.color = '棕色'
print(dog1.color,'的',dog1.kinds)
print(dog2.color,'的',dog2.kinds)
dog1.eat('suggur')
dog2.eat('meat')
dog1.show_last_food()
dog2.show_last_food()
输出如下
黄色 的 京巴
棕色 的 藏獒
黄色 的 京巴 正在吃 suggur
棕色 的 藏獒 正在吃 meat
黄色 的 京巴 上次吃的是 suggur
棕色 的 藏獒 上次吃的是 meat
示例2:
class Human():
def set_info(self,name,age,address = '不详'):
self.name = name
self.age = age
self.address = address
def show_info(self):
print(self.name+'的年龄是:',self.age,',地址是:',self.address)
h1 = Human()
h1.set_info('小张',20,'北京市东城区')
h2 = Human()
h2.set_info('小李',18)
h1.show_info()
h2.show_info()
输出如下
小张的年龄是: 20 ,地址是: 北京市东城区
小李的年龄是: 18 ,地址是: 不详
8.del语句
可以删除对象object(实例instance)的属性
8.1 语法:
del 对象.实例变量名
8.2示例:
class Dog:
pass
dog1 = Dog() # 创建一个实例
dog1.color = '白色' # 添加属性
print(dog1.color) # 白色
del dog1.color # 删除属性
# print(dog1.color) # AttributeError 错误 错误
9.初始化方法
9.1 作用:对新创建的对象添加属性
9.2 语法格式:
class 类名(继承列表):
def __init__(self,[形参列表]):
语句块
注:[] 代表其中的内容可以省略
9.3 说明:
1)初始化方法名 必须为__init__ 不可改变
2)初始化方法会在构造函数创建实例后自动调用,且将实例自身通过第一个参数self传入__init__方法
3)构造函数的实参将通过__init__方法的参数列表传入到__init__方法中
4)初始化方法内如果需要return语句返回,则只能返回None
9.4 示例
# 此示例示意初始化方法的定义,及用初始化方法对新建的对象添加属性
class Car:
'''小汽车类'''
def __init__(self,c,b,m):
self.color = c
self.brand = b
self.model = m
def run(self,speed):
print(self.color,'的',self.brand,self.model,'正在以',speed,'公里每小时行驶')
a4 = Car('白色','宝马',120)
a4.run(99)
输出入下
白色 的 宝马 120 正在以 99 公里每小时行驶
10.析构方法
10.1 语法:
class 类名(继承列表):
def __del__(self):
语句块
注:
析构方法在对象被销毁时自动调用
python语言建议不要在对象销毁时做任何事情,因为销毁时间难以确定
# 此示例示意析构方法的使用
class Car():
def __init__(self,info):
self.info = info
print("汽车对象",info,"被创建")
def __del__(self):
print("汽车对象",self.info,"被销毁")
c1 = Car('BYD E6')
del c1
L = []
L.append(Car("汽车1"))
L.append(Car("汽车2"))
L.append(Car("汽车3"))
del L
input("输入回车执行程序")
print("程序退出")
输出如下
汽车对象 BYD E6 被创建
汽车对象 BYD E6 被销毁
汽车对象 汽车1 被创建
汽车对象 汽车2 被创建
汽车对象 汽车3 被创建
汽车对象 汽车3 被销毁
汽车对象 汽车2 被销毁
汽车对象 汽车1 被销毁
输入回车执行程序 <enter>
程序退出
11.预置实例属性
__dict__属性:绑定一个存储此实例自身变量字典
示例:
class Dog():
pass
dog1.color = '白色'
dog1.kind = '京巴'
print(dog1.__dict__) # {'color': '白色', 'kind': '京巴'}
12.class 属性
'class’属性绑定创建此实例的类
12.1 作用:可以借助此属性来访问创建此实例的类
12.2 示例:
class Dog():
pass
dog1 = Dog()
print(dog1.__class__) #<class '__main__.Dog'>
dog2 = dog1.__class__()
print(dog2.__class__) # <class '__main__.Dog'>
13.用于类的函数
13.1 isinstance(obj,class_or_tuple) 返回这个对象obj是否是某个类的对象,或者某些类中的一个类的对象,如果是返回True
isinstance(3.1,float) # True
isinstance(3.14,(int,Dog,float) # True
13.2 type(obj) 返回对象的类型
type(3.14) # float
type(dog1) # <class'__main__.Dog'>