Python-面向对象

1.初识对象

1.1理解使用对象完成数据组织的思路

思考🤔?
学校开学,要求学生填写自己的基础信息,一人发一张白纸,让学生填写
在这里插入图片描述
改为使用登记表,打印出来让学生自行填写:
在这里插入图片描述
在程序中简单使用变量来记录学生信息
在这里插入图片描述
使用变量记录数据太乱了。
如果程序中也和生活中一样

  • 可以设计表格
  • 可以将设计的表格打印出来
  • 可以将打印好的表格供人填写内容
    那么数据的组织就非常方便了。

使用对象组织数据
在程序中可以做到和生活中那这样,设计表格,生产表格和填写表格的组织形式的
1.在程序中设计表格,我们称之为:设计类(class)

class Studen:
      name = None   #记录学生姓名

2.在程序中打印生产表格,我们称之为:创建对象

# 基于类创建对象
stu1 = Student()
stu2 = Student()

3.在程序中填写表格,我们称之为:对象属性赋值

stu_1.name = "周杰轮"  # 为学生1对象赋予名称属性值
stu_2.name = "林军杰"  # 为学生2对象赋予名称属性值

2.成员方法

2.1类的定义和使用语法

class 类名称 class是关键字,表示要定义类了
类的属性 类的属性,即定义在类中的变量(成员变量)
类的行为 类的行为,即定义在类中的函数(成员方法)

创建类对象的语法
对象 = 类名称()
在这里插入图片描述

class Student:
      name = None # 学生的姓名
      age = None # 学生的年龄
      def say_hi(self):
     	  print(f"Hi大家好,我是{self.name}")
stu = Student()
stu.name = "周杰轮"
stu.say_hi()   # 输出: Hi大家好,我是周杰轮

从上述代码中可以得出

  • 不仅可以定义属性来记录数据
  • 也可以定义函数,用来记录行为
  • 类中定义的属性(变量),我们称之为:成员变量
  • 类中定义的行为(函数),我们称之为:成员方法

定义在类内部的函数称之为方法

2.2成员方法的使用

在类中定义成员方法和定义函数基本一致,但仍有细微的区别:

def 方法名(self,形参1 ....,形参N):
    方法体

可以得出,在方法定义的参数列表中,有一个:self关键字self关键字是成员方法定义的时候,必须填写的。

  • 它用来表示类对象自身的意思
  • 当我们使用类对象调用方法的是,self会自动被Python传入
  • 在方法内部,想要访问类的成员变量,必须使用self

注意事项
self关键字,尽管在参数列表中,但是传参的时候可以忽略它

class Student:
    name = None

    def say_hi(self):
        print(f"Hello,大家好")
    def say_hi2(self,msg):
        print(f"大家好!{msg}")
stu = Student()
stu.say_hi()  # 调用的时候,无需传参
stu.say_hi2("很高兴认识大家")  # 调用的时候,需要传msg参数

在传入参数的时候,self是透明的,可以不用理会他。

3.类和对象

现实世界的事务和类
在这里插入图片描述
类和对象描述现实事务
在这里插入图片描述
程序中通过类来描述
在这里插入图片描述
基于类创建对象
在这里插入图片描述

4.构造方法

4.1使用构造方法向成员变量赋值

class Student:
      name = None  # 名称
      age = None   # 年龄
      tel = None   # 手机号
stu1 = Student()
stu1.name = "周杰轮"
stu1.age = 31
stu1.tel = "18012340000"

stu2 = Student()
stu2.name = "周杰轮"
stu2.age = 31
stu2.tel = "18012340000"

思考🤔
上述代码中,为对象的属性赋值需要依次进行,略显繁琐。
有没有更加高的方式,一行代码完成?
这个括号,能否像函数(方法)那样,通过传参的形式对属性赋值?
使用构造方法: __init__()

  • 在创建类对象(构造类)的时候,会自动执行
  • 在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用
class Student:
      name = None  # 可以省略
      age = None   # 可以省略
      tel = None   # 可以省略
      def __init__(self,name,age,tel)
      	  self.name = name
      	  self.age = age
      	  self.tel = tel
      	  print("Student类创建了一个对象")
stu = Student("周杰轮",31,"18500000000")

构造方法注意事项

  • 构造方法名称:init_,千万不要忘记init前后有两个下划线
  • 构造方法也是成员方法,不要忘记在参数列表中提供:self
  • 在构造方法内定义成员变量,需要使用self关键字
    • 这是因为:变量是定义在构造方法内部,如果要成为成员变量,需要用self来表示
      练习
      在这里插入图片描述
class Student:
    # 构造方法
    def __init__(self):
        self.name = input("请输入学生姓名:")
        self.age = int(input("请输入学生年龄:"))
        self.address = input("请输入学生地址:")

for i in range(1, 11):
    print(f"当前录入第{i}位学习信息,总共需录入10位学习信息")
    stu = Student()
    print(f"学生{i}信息录入完成,信息为:【学生姓名:{stu.name}, 年龄:{stu.age}, 地址:{stu.address}")

5.其他内置方法

5.1__str__字符串方法

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
stu = Student("周杰伦",25)
print(stu)
print(str(stu))
# 输出
<__main__.Student object at 0x000001E952802150>
<__main__.Student object at 0x000001E952802150>

当类对象需要被转换为字符串时,会输出如上结果(内存地址)
内存地址没多大用,我们可以通过__str__方法,控制类转换为字符串的行为。

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
    def __str__(self):
        return f"Student类对象,name={self.name},age={self.age}"

stu = Student("周杰伦",25)
print(stu)
print(str(stu))
# 输出
Student类对象,name=周杰伦,age=25
Student类对象,name=周杰伦,age=25

5.2__lt__小于符号比较方法

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 < stu2)

直接两个对象比较是不可以的,但是在类中实现__lt__方法,即可同时完成:小于符号和大于符号 两种比较

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
    def __lt__(self, other):
        return self.age < other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 < stu2)
# 返回值 True或者False

5.3__le__小于等于比较符号

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
    def __le__(self, other):
        return self.age <= other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 <= stu2) # 结果 True
print(stu1 >= stu2) # 结果 False

5.4__eq__比较运算符实现方法

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
    def __eq__(self, other):
        return self.age == other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 == stu2)
  • 不实现__eq__方法,对象之间可以比较,但是是比较内存地址,也即是:不同对象==比较一定是False结果
  • 实现了__eq__方法,就可以按照自己的想法来决定2个对象是否相等了

6.封装

6.1封装的概念

封装表示的是,将现实世界事物的

  • 属性
  • 行为

封装到类中,描述为

  • 成员变量
  • 成员方法

从而完成程序对现实世界事物的描述
在这里插入图片描述

6.2私有成员的使用

在这里插入图片描述
私有成员的语法

  • 私有成员的变量:变量名以__开头(2个下划线)
  • 私有成员的方法:方法名以__开头(2个下划线)
class Phone:
    IMEI = None  # 序列号
    producer = None  # 厂商
    __current_voltage = 0.5  # 当前电压  私有成员变量
    def call_by_5g(self):
        print("5g通话已开启")
    def __keep_single_core(self):  # 私有成员方法
        print("让cpu以单核模式运行以节省电量")
phone = Phone()
phone.call_by_5g()

注意事项

  • 私有方法无法直接被类对象使用
  • 私有变量无法赋值,也无法获取值

使用私有成员
私有成员无法被类对象使用,但是可以被其他的成员使用

class Phone:
    IMEI = None  # 序列号
    producer = None  # 厂商
    __current_voltage = 1  # 当前电压  私有成员变量
    def call_by_5g(self):
        if  self.__current_voltage >= 1:
            self.__keep_single_core()
            print("5g通话已开启")
    def __keep_single_core(self):  # 私有成员方法
        print("让cpu以单核模式运行以节省电量")
phone = Phone()
phone.call_by_5g()
# 输出
让cpu以单核模式运行以节省电量
5g通话已开启

练习
在这里插入图片描述

class Phone:
    __is_5g_enable = False  # True表示5g开启,False表示5g关闭
    def __check_5g(self):
        if self.__is_5g_enable ==True:
            print("5g开启")
        else:
            print("5g关闭,使用4g网络")
    def call_by_5g(self):
        self.__check_5g()
        print("正在通话中")
phone = Phone()
phone.call_by_5g()
# 输出
5g关闭,使用4g网络
正在通话中

7.继承

7.1继承的概念

在这里插入图片描述
思考🤔?
如果你是设计师,你会如何选择?
1.每一代新款手机,都从零开始设计
2.基于老款的设计,修修改改
设计新手机基于老款的基础上进行修改

class Phone:
    IMEI = None
    producer = "ITCAST"
    def call_by_4g(self):
        print("4g通话")

class Phone2024(Phone):
    face_id = '10001'

    def call_by_5G(self):
        print("2024新功能:5g通话")

单继承
语法:

class 类名(父类名)
      类内容体

多继承
在这里插入图片描述

语法:

class 类名(父类1,父类2...父类3)
      类内容体
class Phone:
    IMEI = None
    producer = "ITCAST"
    def call_by_4g(self):
        print("4g通话")
class NFCReader:
    nfc_type = "第五代"
    producer = "HM"
    def read_card(self):
        print("NFC读卡")

    def write_card(self):
        print("NFC写卡")
class RemoteControl:
    rc_type = "红外遥控"

    def control(self):
        print("红外")
class Myphone(Phone,NFCReader,RemoteControl):
    pass
    
phone = Myphone()
print(phone.producer)
phone.call_by_4g()
phone.read_card()
# 输出
ITCAST
4g通话
NFC读卡
父类的品牌是ITCAST
父类的5g通话
ITCAST

7.2复写和使用父类成员

复写
子类继承父类成员属性和成员方法,如果对其“不满意”,那么可以进行复写。
即:在子类重新定义同名的属性或方法即可。

class Phone:
    IMEI = None
    producer = "ITCAST"
    def call_by_5g(self):
        print("父类的5g通话")
class Myphone(Phone):
    producer = "HM"
    def call_by_5g(self):
        print("子类的5g通话")


phone = Myphone()
print(phone.producer)
phone.call_by_5g()
# 输出
HM
子类的5g通话

调用父类成员

class Phone:
    IMEI = None
    producer = "ITCAST"
    def call_by_5g(self):
        print("父类的5g通话")
class Myphone(Phone):
    producer = "HM"
    def call_by_5g(self):
        # 方式1 调用父成员
        print(f"父类的品牌是{Phone.producer}")
        Phone.call_by_5g(self)
        # 方式2 调用父类成员
        print(f"父类的品牌是{super().producer}")
        super().call_by_5g()
        print("子类的5g通话")

注意事项
方式1调用父类成员

  • 使用成员变量:父类名.成员变量
  • 使用成员方法:父类名.成员方法(self)

方式2调用父类成员

  • 使用成员变量:super().成员变量
  • 使用成员方法:super().成员方法()

8.类型注解

8.1变量的类型注解

主要功能:

  • 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
  • 帮助开发者自身对变量进行类型注释

支持:

  • 变量的类型注解
  • 函数(方法)形参列表和返回值的类型注解

方法1

# 基础容器类型注解
my_list :list = [1,2,3]
my_tuple: tuple = (1,2,3)
mu_dict: dict = {"itheima":666}
# 容器类型详细注解
my_list: list[int] = [1,2,3]
my_tuple: tuple[int,str,bool] = (1,"itheima",True)
my_dict: dict[str,int] = {"itheima":666}
# 类对象类型注解
class Student:
      pass
stu: Student = Student()

方法2

# 在注释中进行类型注解
var_1 = random.randint(1,10) # type: int
var_2 = json.loads('{"name":"zhangsan"}') # type: dict[str,str]
def func():
    return 10
var_3 = func() # type: int 

注意:类型注解只是提示性的,并非决定性的。数据类型和注解类型无法对应也不会导致错误

8.2函数(方法)的类型注解

形参注解

def add(x:int,y:int):
    return x + y
add()

返回值注解

def func(data: list) -> list:
    return data
print(func())

8.3 Union类型

在这里插入图片描述

from typing import Union
my_list: list [Union[int,str]] = [1,2,"heima"]
def func(data: Union[int,str]) ->Union[int,str]:
    pass

9.多态

多态:指的是多种状态。完成某个行为是,使用不同的对象会得到不同的状态。
在这里插入图片描述
多态常作用在继承关系上.

比如

  • 函数(方法)形参声明接收父类对象
  • 实际传入父类的子类对象进行工作

即:

  • 以父类做定义声明
  • 以子类做实际工作
  • 用以获得同一行为, 不同状态

抽象类(接口)
在这里插入图片描述
举例

class  AC:
    def cool_wind(self):
        """制冷"""
        pass
    def hot_wind(self):
        """制热"""
        pass
    def wring_l_r(self):
        """左右摆风"""
        pass
class Midea_AC(AC):
    def cool_wind(self):
        print("美的空调核心制冷科技")
    def hot_wind(self):
        print("美的空调电热丝加热")
    def wring_l_r(self):
        print("美的空调无风感左右摆风")
class GREE_AC(AC):
    def cool_wind(self):
        print("格力空调变频省电制冷")
    def hot_wind(self):
        print("格力空调电热丝加热")
    def wring_l_r(self):
        print("格力空调静音左右摆风")

def make_cool(ac:AC):
    ac.cool_wind()

midea = Midea_AC()
gree = GREE_AC()

make_cool(midea)
make_cool(gree)

# 输出
美的空调核心制冷科技
格力空调变频省电制冷

10.综合案例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import json   # 导入json模块
from pyecharts.charts import Bar   # 导入pyecharts相关的模块
from pyecharts.options import *
from pyecharts.globals import ThemeType
class Record:   # 数据定义的类
    def __init__(self,date,order_id,money,province):  # 该四个变量,在创建类对象时,需要将变量写入
        self.date = date
        self.order_id = order_id
        self.money = money
        self.province = province

    def __str__(self):    # 魔法方法,控制类转换为字符串(原输出为内存地址)
        return f"{self.date},{self.order_id},{self.money},{self.province}"

# 定义一个抽象类用来做顶层设计,确定有哪些功能来实现
class FileReader:
    def read_data(self) ->list[Record]:
        # 读取文件的数据,读到的每一条数据都转换为Record对象,将他们封装到list内
        pass

class TextFileReader(FileReader):
    def __init__(self,path):  # 定义成员变量的路径
        self.path = path

    # 复写父类的方法
    def read_data(self) ->list[Record]:
        record_list = []
        f = open(self.path,"r",encoding="UTF-8")
        for line in f.readlines():
            line = line.strip()  # 消除读取到的每一行数据中的\n
            data_list = line.split(",")
            record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
            record_list.append(record)
        f.close()
        return record_list

class JsonFileReader(FileReader):
    def __init__(self,path):
        self.path = path # 定义成员变量的路径

    def read_data(self) ->list[Record]:
        f = open(self.path,"r",encoding="UTF-8")
        record_list = []
        for line in f.readlines():
            data_dict = json.loads(line)  # 转换
            record = Record(data_dict["date"],data_dict["order_id"],int(data_dict["money"]),data_dict["province"])
            record_list.append(record)
        f.close()
        return record_list

text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON.txt")
jan_data: list[Record]=  text_file_reader.read_data()
feb_data: list[Record] = json_file_reader.read_data()
# 将两个月的数据转换为1个list来存储
all_data: list[Record] = jan_data + feb_data

# 开始进行数据计算,通过字典的方式
# {"2011-01-01":1534,"2011-01-02":300,"2011-01-03":500}
data_dict = {}
for record in all_data:
    if record.date in  data_dict.keys():
        # 当前日期已有记录,所以和老记录累加即可
        data_dict[record.date] += record.money
    else:
        data_dict[record.date] = record.money

# 可视化图表开发
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(list(data_dict.keys()))  # 添加x轴数据
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))  # 添加y轴数据
bar.set_global_opts(
    title_opts=TitleOpts(title="每日销售额")
)  # 添加全局配置
bar.render("综合案例.html")
  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,面向对象编程(Object-Oriented Programming,简称OOP)是一种常用的编程范式。它将数据和操作数据的方法封装在一起,形成对象,通过对象之间的交互来实现程序的功能。 Python中的面向对象编程主要包括以下几个概念: 1. 类(Class):类是对象的模板,用于定义对象的属性和方法。通过类可以创建多个具有相同属性和方法的对象。 2. 对象(Object):对象是类的实例,具有类定义的属性和方法。通过实例化类可以创建对象。 3. 属性(Attribute):属性是对象的特征,用于描述对象的状态。可以通过点操作符访问和修改对象的属性。 4. 方法(Method):方法是与对象相关联的函数,用于定义对象的行为。方法可以访问和修改对象的属性。 5. 继承(Inheritance):继承是一种机制,允许一个类继承另一个类的属性和方法。子类可以继承父类的属性和方法,并可以在此基础上进行扩展或修改。 6. 多态(Polymorphism):多态是一种特性,允许不同类的对象对同一消息做出不同的响应。通过多态可以实现接口的统一和代码的灵活性。 7. 封装(Encapsulation):封装是一种将数据和操作数据的方法封装在一起的机制,隐藏了对象的内部细节,只暴露必要的接口。 Python中的面向对象编程可以通过定义类、创建对象、调用对象的方法和访问对象的属性来实现。下面是一个简单的示例: ```python # 定义一个类 class Person: # 初始化方法 def __init__(self, name, age): self.name = name self.age = age # 方法 def say_hello(self): print("Hello, my name is", self.name) # 方法 def get_age(self): return self.age # 创建对象 person = Person("Alice", 25) # 调用对象的方法 person.say_hello() # 访问对象的属性 print("Age:", person.get_age()) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值