python之面向对象(解析)
学习Python的推荐顺序是:基础语法-数据结构-面向对象-Web开发-数据分析 #生活技巧# #工作学习技巧# #编程语言学习路径#
什么是对象:对象是指现实中的物体或实体
什么是面向对象:把一切看成对象(实体),用各种对象之间的关系来描述事物
对象的特征: 1.对象有很多种属性(名词或者形容词)
年龄,姓名,性别
2.对象有很多行为(动作,动词)
学习,吃饭,睡觉,踢球,工作...
拥有相同属性和行为的对象分为一组,即一个类
类是用来描述对象的工具,用类可以创建此类的对象(实例)
类和对象示意:
车(类)------------->BYD E6(京A88888) 对象
狗(类)------------->哈士奇(户籍号:00001) 对象
类的创建语句class 语句 语法:
class 类名(继承列表):
'''类文档字符串'''
实例方法定义
类变量定义
类方法定义(@classmethod)
静态方法定义(@staticmethod)
作用:
创建一个类
类用于描述对象的行为和属性
类用于创建此类的一个或多个对象(实例)
说明:
类名必须为标识符(与变量名命名规则相同,建议首字母大写)
类名实质上就是变量,它绑定一个类
示例:
class Dog:
'''创建一个Dog类,此类用于描述一种小动物的行为和属性'''
pass
dog1 = Dog()
print(id(dog1))
dog2 = Dog()
print(id(dog2))
print('++++++++++++++++++++++++++++++++')
lst1 = list()
print(id(lst1))
lst2 = list()
print(id(lst2))
构造函数 构造函数调用表达式;
类名([创建传参列表])
作用:
创建这个类的实例对象,并返回此实例对象的引用关系
说明:
实例有自己的作用域和名字空间,可以为该实例添加实例变量(也叫属性)
实例可以调用类的方法和实例方法
实例可以访问类变量和实例变量
语法:
class 类名(继承列表):
def 实例方法名(self,形参名1,形参名2.....):
'方法文档字符串'
语句快
作用:
用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为
说明:
实例方法的实质是函数,是定义在类内的函数
实例方法至少有一个形参,第一个形参用来绑定调用这个方法的实例,一般命名为"self"
实例方法的调用语句:
实例.实例方法名(调用传参)
#或
类名.实例方法名(实参.调用传参)
示例:
class Dog:
'''创建一个Dog类,此类用于描述一种小动物的行为和属性'''
def eat(self,food):
'''此方法用来描述小狗吃东西的行为'''
print('id为',id(self),'的小狗正在吃',food)
def sleep(self,hour):
print('小狗睡了',hour,'小时')
def play(self,obj):
print('小狗正玩',obj)
dog1 = Dog()
dog1.eat('骨头')
dog1.sleep(1)
dog1.play("皮球")
dog2 = Dog()
dog2.eat('狗粮')
dog2.sleep(2)
dog2.play('飞盘')
实例属性 sttribute(也叫实例变量)每个实例可以有自己的变量用来保存对象自己的数据,称为实例变量(也叫属性)
语法:
实例.属性名
赋值规则同变量的赋值规则
首次为属性赋值则创建此属性
再次为属性赋值则改变属性的绑定关系
作用:
记录每个对象自身的数据
练习:
定义一个'人'(hunman)类
class Human:
def set_info(self,name,age,address = '不详'):
'''此方法用来给人对象添加姓名,年龄,家庭住址'''
def show_info(self):
'此处显示此人的信息'
调用如下:
h1 = Human()
h1.set_info('小强',20,'北京市东城区')
h2 = Human()
h2.set_info('小李',18)
h1.show_info()
h2.show_info()
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()
del 语句
可以删除对象(实例)的属性
语法:
del对象.实例变量名
示例:
class Dog:
pass
dog1 = Dog()
dog1.color = '白色'
print(dog1.color)
del dog1.color
print(dog1.color)
del语句小结:
1)删除变量 del name
2)删除列表的元素 del l[],del l[::2]
3)删除字典的键 del d['name']
4)删除对象的属性 del dog1.color
作用:
对新创建的对象添加属性
语法格式:
class 类名(继承列表):
def __init__(self,[形参列表]):
语句块
注:[]代表其中的内容可以省略
说明:
1.初始化方法名必须为"__init__"不可改变
2.初始化方法会在构造函数创建实例后自动调用,
且将实例自身通过第一个参数self传入__init__方法
3.构造函数的实参将通过__init__方法的参数列表传入到__init__方法中
4.实例化方法内如果需要return语句返回,则只能返回None
示例:
class Car:
'''小汽车'''
def __init__(self,c,b,m):
self.color = c
self.brand = b
self.model = m
def run(self,spend):
print(self.color,'的',self.brand,self.model,
'正在以',spend,'公里/小时的速度行驶')
a4 = Car("红色",'奥迪','a4')
a4.run(199)
t1 = Car('蓝色','TESLA','Modle S')
t1.run(230)
练习:
写一个Student类,此类创建的对象有3个属性
姓名,年龄,成绩
1)用初始化方法为该类添加上述三个属性
2)添加set_score方法能为对象修改学生成绩
3)添加show_info()方法,打印学生信息
class Student:
def __init__(self,name,age,score= None):
self.name = name
self.age = age
self.score = score
def set_score(self,score):
if 0 <= score <= 100:
self.score = score
def show_info(self):
print(self.name,'今年',self.age,'岁','成绩为:',self.score,'分')
l = []
l.append(Student('小张',20,100))
l.append(Student('小李',18,95))
l.append(Student('小魏',18))
l[2].set_score(78)
for obj in l:
obj.show_info()
析构方法:
class 类名(继承列表):
def __del__(self):
语句块
析构方法在对象被销毁时被自动调用
python语言建议不要在对象销毁时做任何事情,因为销毁时间难以确定
示例:
del_method.py
预置实例属性
__dict__属性
__dict__属性绑定一个存储此实例自身变量字典
示例:
class Dog:
pass
dog1 = Dog()
print(dog1.__dict__)
dog1.color = '白色'
print(dog1.__dict__)
dog1.kinds = '京巴'
print(dog1.__dict__)
__class__属性
'__class__'属性绑定创建此实例的类
作用:
可以借助此属性来访问创建此实例的类
示例:
class Dog:
pass
dog1 = Dog()
print(dog1.__class__)
dog2 = dog1.__class__()
print(dog2.__class__)
用于类的函数:
isinstance(obj,class_or_tuple)
返回这个对象obj是否是某个类的对象或者某些类中的一个类的对象
如果是则返回True,否则返回False
type(obj) 返回对象的类型
练习:
面向对象的综合示例:
有两个人:
属性:
1.姓名:张三,年龄 35岁
2.姓名:李四,年龄 8岁
行为:
1. 教别人学东西 teach
2. 工作赚钱 work
3. 借钱 borrow
事情:
张三 教 李四 学 python
李四 教 张三 学 王者荣耀
张三 上班赚了 1000 元钱
李四 向 张三 借了 200元钱
35 岁的 张三 有钱 800元,他学会的技能:王者荣耀
8 岁的 李四 有钱 200元,他学会的技能:python
class Human:
def __init__(self,name,age):
self.name = name
self.age = age
self.money = 0
self.skill = []
def teach(self,other,skill):
print(self.name,'教',other.name,'学',skill)
other.skill.append(skill)
def work(self,m):
print(self.name,'上班赚了',m,'元钱')
self.money += m
def borrow(self,other,m):
if other.money > m:
print(self.name,'向',other.name,'借',m,'元钱')
other.money -= m
self.money += m
else:
print(other.name,'没有钱借给',self.name)
def show_info(self):
print(self.age,'岁的',self.name,'有钱',self.money,
'元,他学会的技能为:','、'.join(self.skill))
zhang3 = Human("张三",35)
li4 = Human('李四',8)
zhang3.teach(li4,'python')
li4.teach(zhang3,'王者荣耀')
zhang3.work(1000)
li4.borrow(zhang3,200)
zhang3.show_info()
li4.show_info()
类变量类变量是类的属性,此属性属于类,不属于此类的实例
作用:
通常用来存储该类创建对象的共有属性
说明:
类变量可以通过该类直接访问
类变量可以通过类的实例直接访问
类变量可以通过此类的对象的__class__属性,间接访问
示例:
class Human:
total_count = 0
pass
print(Human.total_count)
h1 = Human()
print(h1.total_count)
h1.total_count = 10000
print(h1.total_count)
print(Human.total_count)
h1.__class__.total_count +=1
print(Human.total_count)
class Huamn:
total_count = 0
def __init__(self,n):
self.name = n
self.__class__.total_count +=1
print(n,'对象被创建')
def __del__(self):
print(self.name,'对象被销毁')
self.__class__.total_count -=1
l = []
l.append(Huamn('张飞'))
l.append(Huamn('关羽'))
l.append(Huamn('刘备'))
print("当前任务的个数是:",Huamn.total_count)
del l[1]
print("当前任务的个数是:",Huamn.total_count)
类的文档字符串: 类的第一个没有赋值给任何变量的字符串为类的文档字符串
类的文档字符串可以通过help()函数查看
类的文档字符串绑定在类的__doc__属性上
作用:
限定一个类创建的实例只能有固定的属性(实例变量)
不允许对象添加列表以外的实例属性(实例变量)
防止用户因错写属性名而发生程序错误
说明:
__slots__属性绑定一个字符串列表
含有__slots__属性的类所创建的二十里对象没有__dic_-属性,因此实例不用字典存储
示例:
class Human:
__slots__ = ['name','age']
def __init__(self,n,a):
self.name = n
self.age = a
def info(self):
print(self.name,"今年",self.age,'岁了')
h1 = Human("校长",8)
h1.info()
h1.Age = 9
h1.info()
类方法@classmethod类方法是用来描述类的行为的方法,类方法属于类,不属于类的实例对象
说明:
类方法需要先使用@classmethod装饰器定义
类方法至少还有一个形参,第一个形参用于绑定类,约定写为'cls'
类和该了IDE实例都可以调用类方法
类方法不能访问此类创建的对象的实例属性
示例:
class A:
v = 0
@classmethod
def get_v(cls):
return cls.v
@classmethod
def set_v(cls,a):
cls.v = a
print('A.v = ',A.get_v())
A.set_v(10000)
print("A.v = ",A.get_v())
静态方法 @staticemethod静态方法是定义在类内部的函数,此函数的作用域是类的内部
说明:
静态方法需要使用@staticemethod装饰器定义
静态方法与普通函数定义相同,不需要传入self实例参数和cls类参数
静态方法只能凭借该类和该类创建的实例调用
练习:
用类来描述一个学生的信息,(可以修改值之前的student类)
class Studet:
...
学生信息有:
姓名,年龄,成绩
将这些学生对象存于列表中,可以任意添加和删除学生
1)打印出学生的个数
2)打印出学生的平均成绩
3)打印出学生的平均年龄
(建议用类内的列表来存储学生的信息)
class Student:
l = []
def __init__(self,n,a,s):
self.name = n
self.age = a
self.score = s
@classmethod
def add(cls):
cls.l.append(Student('xiaoming',16,100))
cls.l.append(Student('xiaoli',13,95))
cls.l.append(Student('moshou',13,99))
@classmethod
def del_student(cls):
del cls.l[0]
@classmethod
def st_count(cls):
return len(cls.l)
@classmethod
def av_score(cls):
return sum(map(lambda obj:obj.score,cls.l))/ len(cls.l)
@classmethod
def av_age(cls):
return sum(map(lambda obj:obj.age,cls.l))/ len(cls.l)
Student.add()
print('学生的人数是:',Student.st_count())
print('学生的平均年龄是:',Student.av_age())
pr
网址:python之面向对象(解析) https://www.yuejiaxmz.com/news/view/442681
相关内容
python数据分析之读写txt文件Python数据分析:对饮食与健康数据的分析与可视化
Python :=海象运算符最简单的解释
揭秘Python虚拟助手:与未来的对话
Python财务数据分析与金融风险评估
python
陕西选调生言语理解:行测词语辨析角度之搭配对象
Python制作生活工具
高效时间管理:Python编程助力职场与家庭生活平衡之道
Python+Django二手商品网站