【Python学习】面向对象(上)

一.面向对象编程概述

说到面向对象,我们可能不禁想到…
在这里插入图片描述
想的挺好,可你有对象吗!!?

所以还是言归正传- -

那么什么是面向对象呢?

在现实世界中存在各种不同形态的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象间的关系来描述事物之间的联系,这种思想就是面向对象编程(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

…狂奔的蜗牛~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值