一.面向对象编程概述
说到面向对象,我们可能不禁想到…
想的挺好,可你有对象吗!!?
所以还是言归正传- -
那么什么是面向对象呢?
在现实世界中存在各种不同形态的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象间的关系来描述事物之间的联系,这种思想就是面向对象编程(OOP, Object Oriented Programming)。
我们把面向过程和面向对象做个对比:
在上面的五子棋基础上,若加入悔棋功能,面向过程和面向对象,分别怎么实现呢?
现在是不是对于所谓的面向对象编程有了进一步了解呢!
二.类和对象
2.1类和对象的关系
- 面向对象编程有两个非常重要的概念:类和对象。
- 对象是面向对象编程的核心。
- 具有相似特征和行为的事物的集合统称为类
- 对象是根据类创建的,一个类可以对应多个对象。
2.2 类的定义
类是由3部分组成的:
类的名称:类名,首字母必须大写,比如Person。
类的属性:一组数据,比如姓名、性别。
类的方法:允许进行操作的方法,比如说话。
使用class关键字来声明一个类,基本格式如下:
class 类名: #类名首字母大写
类的属性
类的方法(self)
例:
class Car:
price = 0
def getSpeed(self):
return 100
car = Car()
print(car.getSpeed())
2.3 根据类创建对象
例:
class Car:
price = 0
car = Car() #实例化
print(f'car.price:{
car.price}') #输出价格
car.price = 10 #修改价格
print(f'car.price:{
car.price}')
car.color = 'blue' #修改颜色
print(f'car.color:{
car.color}')
Car.price = 100 #不实例化情况下修改价格
print(f'Car.price:{
Car.price}')
思考:这么做有什么缺点?怎么改进?
缺点:难以对属性进行管理,使用混乱
改进:区分类属性和实例属性,私有变量和公有变量
2.4 类、对象的属性和方法
- 类属性:定义在所有函数外边,不需要实例化直接进行使用,使用方法是
类名.属性。
- 对象属性:定义在构造函数__init__中,只有实例化后才可使用,使用方法是
对象.属性。
- 私有属性和私有方法:在属性名或者函数名前加入2个下划线
__
。 - 定义成员方法(成员函数):在类内定义时必须有参数self,否则会报错。
例1:
class Fruit:
price=0 #定义一个类属性
def __init__(self): #构造函数
self.color="red" #实例属性,以self为前缀
zone="China" #局部变量,不以self为前缀
self.__buying_price=1 #私有属性,以self.__为前缀
if __name__=="__main__":
print(Fruit.price) #使用类名调用类变量 0
apple=Fruit() #实例化apple
print(apple.color) #打印apple实例的颜色 red
Fruit.price += 10 #将类变量+10
print("apple price:"+str(apple.price)) #改变类属性将会影响对象属性的值,打印apple实例的price 10
banana=Fruit() #实例化banana
print("banana price:"+str(banana.price)) #打印banana实例的price 10
#print(banana.zone) #无法访问局部变量
#print("apple buying price:"+str(apple.__buying_price)) #禁止访问私有变量
例2:
class Fruit:
price=0 #定义一个类属性
def __init__(self): #构造函数
self.__color="red" #实例属性,以self为前缀
zone="China" #局部变量,不以self为前缀
self.__buying_price=1 #私有属性,以self.__为前缀
def setColor(self, new_color):
if new_color=="white":
return
else:
self.__color=new_color
def getColor(self):
return self.__color
if __name__=="__main__":
apple=Fruit() #实例化apple
apple.setColor("white") #修改apple实例的颜色 white
print(apple.getColor()) #查看修改结果(失败)
apple.setColor("yellow") #修改apple实例的颜色 yellow
print(apple.getColor()) #查看修改结果(成功)
三.构造方法和析构方法
构造方法
构造方法指的是__init__方法。
当创建类的实例的时候,系统会自动调用构造方法,从而实现对类进行初始化的操作。
析构方法
__del__方法被称为析构方法。
当删除一个对象来释放类所占用资源的时候,Python解释器默认会调用另外一个方法,这个方法就是__del__( )方法。
四.self的理解
- 在方法的列表中,第1个参数永远都是self。
- self的字面意思是自己,我们可以把它当做C++里面的this指针理解,表示的是对象自身。
- 当某个对象调用方法的时候,Python解释器会把这个对象作为第1个参数传给self,开发者只需要传递后面的参数就可以了。
五.运算符重载
运算符重载是通过实现特定的方法使类的实例对象支持Python的各种内置操作 。
例如:
+运算符是类里提供的__add__这个函数,当调用+实现加法运算的时候,实际上是调用了__add__方法。
例:
class Cat:
def __init__(self,name1,name2):
self.name1 = name1
self.name2 = name2
def __add__(self):
print('运算符被重载 ')
print(f'{
self.name1} and {
self.name2}')
cat1 = Cat('mimi','miaomiao')
cat1.__add__()
the_end