一:前言:为什么要学类?
类 是一个独立存放变量(属性/方法)的空间
1.简化代码,提升效率,避免代码重复写入。如用户注册、校验、登录方法可以放在一个类中,需要哪个方法就调用哪个
类===》建立模型框架(建立一个方法)===》很多鼠标(实例化)===》都是独立的
2.面向对象:直接给我们结果
例1. 列表的方法
li=[1,2,3] # 对象、实例
print(dir(li))
运行截图:
例2. 类名()===>实例
li=list()
li.append(123)
print(li)
运行截图:
二 .类相关案例
'''
方法===》点击、移动、右击 方法就是行为
属性===》重量、颜色、牌子、大小
'''
例1. 鼠标类 这样的写法不是很
class Shubiao: color='褐色' # 类里面的变量为属性,属性固定 brand='AA' def click(self): # self代表的是实例本身 print('我点击了') def move(self,direction): print('移动到%s'%direction) # 类名() ===》实例化一个鼠标出来,mouse1与mouse2 为独立的个体 mouse1=Shubiao() # 实例 Shubiao.color='蓝色' # 修改类属性:一定要通过类,而不是通过实例,类名赋值 mouse1.color='红色' # 实例属性并不是修改:通过实例 print(mouse1.color) # 调用类属性==》实例名.属性名或者类.属性 # # Shubiao.move(mouse1,'下面') # print(Shubiao.color) mouse1.click() mouse1.move('左边') print(dir(mouse1)) # 如果再次生产出一个鼠标 mouse2=Shubiao() # 两个鼠标的模型是一样的 mouse2.move('右边') # 有参数需要传参数 print(mouse2.color)
运行截图:
例2. 人类
方法:跑步、吃东西
属性:姓名、年龄、身高
类与实力之间的关系:
方法:
a. 实例也是一个独立存放变量的空间,每个实例都是一个独立的变量空间。 不同实例之间的空间互相不可见。
b. 一个“实例”的“特征”,就是“属性” , 姓名、年龄、身高
c. 和函数的传参一样,只是会先传一个自身的实例self
d. 通常,将默认会传入的那个参数命名为self,用来表示调用这个方法的实例对象本身
第一种写法:
class Person:
# name='小明'
def run(self,name): # self实例本身
# 实例属性===》通过实例名.属性
# print('%s在跑步'%Person.name)
print('%s在跑步'%name)
def eat(self,name):
print('%s吃东西'%name)
#
xiaoming=Person() # 小明的这个实例
xiaoming.run('xiaoming')
xiaoming.eat('xiaomimg')
# #
xiaohua=Person()
xiaohua.run('xiaohua')
运行截图:
第二种写法:
缺点: 先调用跑步的方法才可以调用吃的方法
class Person: # name='小明' def run(self,name): # self实例本身 # 实例属性===》通过实例名.属性 ====解决了属性的固定 # 实例属性 name 上面的参数 self.name=name # print('%s在跑步'%Person.name) # print('%s在跑步'%name) print('%s在跑步'%self.name) def eat(self): print('%s吃东西'%self.name) # xiaoming=Person() # 小明的这个实例 xiaoming.run('xiaoming') xiaoming.eat()
# 小花的这个实例 xiaohua=Person() xiaohua.run('xiaohua') # 不用每个方法都传参数,self.name=name 第一次传参已经保存了对应信息,所以eat()无需再次传参 xiaohua.eat()
运行截图:
第三种写法:优化以上写法(增加初始化)
class Person:
def __init__(self,name,age): # 魔术方法 ==自己调用自己(当创建实例的时候==xiaoming=Person())
print('这里是初始化方法')
self.name=name # 初始化的时候定义好(经常用的,不经常用的在方法里面直接传参)
self.age=age
def run(self): # self实例本身
print('%s在跑步'%self.name)
def eat(self):
print('%s吃东西'%self.name)
def f(self,t):
print('我今天%s多重'%t)
xiaoming=Person('小明',19) # 小明的这个实例
xiaoming.run()
xiaoming.eat()
xiaoming.f('90') # 不经常用的在这里直接传参即可
运行截图:
第四种写法 :增加 析构方法
class Person:
# 初始化方法在创建实例的时候调用
def __init__(self,name,age): # 魔术方法 ==自己调用自己(当创建实例的时候==xiaoming=Person())
print('这里是初始化方法')
self.name=name # 初始化的时候定义好(经常用的,不经常用的在方法里面直接传参)
self.age=age
# 析构方法在实例调用结束的时候调用,结束有两种方式:自动结束(程序结束的时候触发)和手动结束(哪里结束哪里触发)
def __del__(self): # 在实例没有用的时候调用
print('被销毁了')
def run(self): # self实例本身
print('%s在跑步'%self.name)
def eat(self):
print('%s吃东西'%self.name)
def f(self,t):
print('我今天%s多重'%t)
xiaoming=Person('小明',19) # 小明的这个实例
xiaoming.f(90) # 程序走到这里的时候并不知道还有没有小明这个实例或者不知道后面还有没有其他实例用
# del xiaoming # 可以手动提前结束程序,如果不写最后(程序走完的时候)才调用
print(xiaoming.age)
# #
xiaohua=Person('小明',18) # 程序走完了(没人用实例的时候,实例结束...)调用销毁方法
运行截图1:
运行截图2: