Python面向对象
面向对象
一种编程思维:其设计的程序能够将数据和对数据进行的操作封装在一起组成一个类
可以通过类创建对象,通过对象之间的交互来解决问题
**面向对象编程(OOP : Object Oriented Programming)😗*利用面向对象中类和对象的思维进行问题解决
面向过程和面向对象对比:
面向过程:遇到问题,首先自己修改代码解决问题
面向对象:遇到问题,首先找已存在能解决问题的程序
类和对象
类
- 人以类聚,物以群分
- 类具有相同的属性和方法
- 类是抽象的
- 一个类可以有多个对象
对象
对象是真实存在的能够看到和摸到的具体的事物
类和对象的使用
-
定义一个学生类:使用关键字class
class Student: # 在类中构造方法(对象方法) def study(self): return '学生在学习' def play(self,game): return f'学生在玩{game}'
self : 行业内约定成俗的一个名字,谁调用就指向谁
self : 指代被实例化出来的对象,self相当于一个类中各部分传参的介质
-
通过类实例化对象
# 使用构造器语法创建对象 s1 = Student() print(s1) l1 = list() l1.append(1)
-
对象调用对象方法(这个实例化出来的个体去做它能做的事)
# a.对象.对象方法(参数) print(s1.study()) # b.类.对象方法(对象,参数) print(Student.play(s1, 'lol'))
类和对象的属性
class Student:
# 定义类属性
schoolUniform = '校服'
# 初始化方法(设置对象属性)
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
# 在学生类中给学生构造方法(对象方法)
def study(self):
return f'{self.age}岁穿着{Student.schoolUniform}的{self.name}在学习'
def play(self,game):
return f'{self.name}在玩{game}'
# 给某个对象赋予属性(对象属性)
s1 = Student('张三','男',20)
print(s1)
print(s1.play('lol'))
# 对象属性:对象属性是某个个体自己独有的属性
# 类属性:整体的这一类共同拥有的特点
# 调用类属性
# 1.类名.类属性
print(Student.schoolUniform)
# 2.对象.类属性
print(s1.schoolUniform)
# 调用对象属性:
# 对象.对象属性
print(s1.name)
各种方法
-
**对象方法:**在类中定义的对象能够做的事情的方法,叫做对象方法
方法中第一个参数为self
,指向对象 -
**类方法:**在类中给类定义的方法,需要写语法糖
@classmethod
类方法中第一个参数是cls
,指向类 -
**静态方法:**在类中定义的普通方法,需要写语法糖
@staticmethod
既不指向类,也不指向对象,仅仅是依附于类 -
如何调用
- 对象方法只能是对象调用
- 类方法既可以直接使用类进行调用,也可以使用对象调用
- 静态方法既可以直接使用类进行调试,也可以使用对象调用
class triangle:
def __init__(self,a,b,c):
self.a = a
self.b = b
self.c = c
@classmethod
def isTriangle(cls,a,b,c):
if a + b > c and a + c > b and b + c > a:
return True
else:
return False
def permeter(self):
return self.a + self.b + self.c
def area(self):
'''海伦公式(秦九韶公式)'''
p = self.a + self.b + self.c
a,b,c = 3,4,5
if triangle.isTriangle(a,b,c):
t1 = triangle(a,b,c)
else:
print('无法构成三角形')
-
魔法方法:是python定义的一系列由双下划线 + 方法名组成的特殊方法
魔法方法不需要调用,会在合适的阶段自动被触发;若手动调用魔法方法,可以手动对魔法方法的功能进行修改。
常见的魔法方法:
# __int__:初始化对象属性 # __del__:内存回收机制(ARC),在一个对象被销毁后自动回收内存(python) # __str__:将其他数据类型转字符串:a.%s, str()等被调用时会自动触发本方法 # __repr__:是__str__的备胎 # __add__:加 + # __sub__:减 - # __truediv__:真除法 \ # __floordiv__:整除 # __mod__:取余 %
class Student: def __init__(self,name,age): self.name = name self.age = age def __repr__(self): return f'{self.name}有{self.age}岁' s1 =Student('三四',23) print(s1)
重写和继承
继承:在python中,是为了最大程度减少代码量
被继承的类叫做夫类、基类、超类,继承的类叫做子类、衍生类、派生类,子类能够继承父类的属性和方法。一个子类可以继承多个类,也可以间接继承
# 老王是煎饼果子名人,想让小王子承父业
class father:
def __init__(self,name = '老王',power = '《煎饼果子宝典》'):
self.name = name
self.power = power
def cook(self):
return f'{self.name}拥有{self.power}'
f1 = father()
print(f1.cook())
继承语法:类名后面添加小括号,小括号中写被继承的父类的类名
class son(father):
# 子类还能拥有自己的属性,但是不再拥有父类的属性
def __init__(self,age):
# 子类的超类初始化属性
# super(son,self).__init__()
# 或者直接将父类数据拿出来
father.__init__(self)
self.age = age
# 子类虽然继承了父类,但子类还可以拥有自己的方法
def newPower(self,book):
return f'{self.name}刻苦修炼,掌握了{book}'
# 重写父类的方法
def cook(self):
return f'{self.name}偷偷学会了肉夹馍'
# 子类重写父类方法后还想再使用父类的方法
def oldCook(self):
return super(son,self).cook()
s1 = son(20)
s1.name = '小王'
print(s1.cook())
print(s1.newPower('千层饼的制作方法'))
print(s1.oldCook())