pytho面向对象

初识对象


使用对象数据


1.在程序中设计表格,设计类(class)
class Student :
name = None #记录学生姓名

2.在程序中打印生产表格,创建对象
# 基于类创建对象
stu_1.name = Student()
stu_2.name = Student()

3.在程序中填写表格,对象属性赋值
stu_1.name ="h" #为学生1对象赋予名称属性值
stu_1.name =w" #为学生2对象赋予名称属性值

 

使用对象数据

# 设计一个类(类比生活中:设计一张登记表)

class Student:

name = None

gender = None

nationality = None

native_place = None

age = None

# 创建一个对象(类比生活中:打印一张登记表)

stu_1 = Student()

# 对象属性进行复制

stu_1 .name = "h"

stu_1 .age = 17

stu_1 .native_place = "dz"

stu_1 .gender = "男"

stu_1 .nationality = "China"

# 获取对象中记录的信息

print(stu_1.name)

print(stu_1.age)

print(stu_1.gender)

print(stu_1.nationality)

print(stu_1.native_place)

类的成员方法


类的定义和使用


成员变量和成员方法


类中
●可以定义属性用来记录数据
●也可以定义函数,用来记录数据
其中
●定义的属性(变量):成员变量
●定义的行为(函数):成员方法

image.png


注意事项

image.png



类和对象


使用类和对象描述现实事务

类只是一种程序内的“设计图纸”,需要基于图纸生产实体(对象),才能正常工作。


在程序中通过类来描述

基于类创建对象

image.png


面向对象编程


设计类,基于类创建对象,由对象做具体的工作
构造方法
属性(成员变量)的赋值
通过传参的形式对属性赋值使用构造方法 __init__()


构造方法

属性(成员变量)的赋值

通过传参的形式对属性赋值使用构造方法 __init__()

构造方法

python类 :__init__()
可以实现
●在创建类对象(构造类)的时候,会自动执行
●在创建类对象(构造类)的时候,将传入参数自动传递给 __init__()方法使用
class Student:

        name = None

        age = None

        def __init__(self,name,age):

                self.name =name

                self.age = age print(name,age)

stu = Student ("w","l")
成员方法可以不写
通过这个语句(self.name self.age)赋值,成员变量就存在了(赋值又定义)
# 正确调用__init__方法,传递了name和age参数
构造方法注意事项

image.png


内置方法(魔术方法)

image.png


__str__字符串方法

image.png

# __str__字符串方法
class Student():
# 这里定义的name和age是类变量,而不是实例变量。
# 通常情况下,我们不会在类级别直接定义实例的属性,除非有特别的需求(如默认值)。
        name = None
        age = None

# 初始化方法,当创建类的新实例时自动调用
        def __init__(self, name, age):
# 使用self关键字来引用实例本身,并为其实例变量赋值
                self.name = name
                self.age = age

# 定义一个特殊方法,用于返回对象的字符串表示形式

        def __str__(self):
# 使用f-string格式化字符串,返回学生的名字和年龄
                return f"{self.name},{self.age}"

# 创建一个Student类的实例s,并传入名字"w"和年龄3

s = Student("w", 3)

# 调用print函数时,会隐式地调用对象的__str__方法
# 因此,这里会打印出s对象的字符串表示形式,即"w,3"
print(s)

__it__小于符号比较方法

image.png

class Student():
        name = None
        age = None
        def __init__(self, name, age):
                self.name = name
                self.age = age
        def __lt__(self,other):
                return self.age < other.age # <运算符并且得到正确的结果

s1 = Student ("w" , 11)
s2 = Student ("y" , 21)
print(s1 >s2)


__le__小于等于比较符号

image.png

class Student():
        name = None
        age = None
        def __init__(self, name, age):
                self.name = name
                self.age = age
        def __le__(self,other):
                return self.age <= other.age # <=运算符并且得到正确的结果
stt = Student ("w",4)
ste = Student ("h",4)
print(stt>=ste)

__eq__比较运算符实现方法

image.png

class Student():
        name = None
        age = None
        def __init__(self, name, age):
                self.name = name
                self.age = age
        def __le__(self,other):
                return self.age <= other.age # <=运算符并且得到正确的结果
 stt = Student ("w",4)
ste = Student ("h",4)
print(stt>=ste)


封装


面向对象编程: 基于模板(类)去创建实体(对象),使用对象完成功能开发
面向对象三大特性:封装,继承,多态

image.png


私有成员


类中提供了私有成员的形式来支持
●私有成员变量
●私有成员方法
定义私有成员的方式
●私有成员变量:变量名以__开头(2个下划线)
●私有成员方法:方法名以__开头(2个下划线)
类对象无法访问私有成员
类中其他成员可以访问私有成员
私有成员(内部)
类对象(外部)eg人民无法访问国家机密
私有成员意义:在类中仅供内部使用的属性和方法,而不对外开放(类对象无法使用)


使用私有成员

image.png

class Student():
        name = None
        age = None
        def __init__(self, name, age):
                self.name = name
                self.age = age
def __eq__(self,other):
                return self.age == other.age
sr = Student ("w",4)
se = Student ("h",5)
print(sr == se)



继承


基础语法
 

image.png

image.png

image.png


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

image.png


继承分为:单继承和多继承
继承表示:将父类 那里继承(复制)来成员变量和成员方法(不含私有)

多继承:python的类之间也支持多继承,即一个类,可以继承多个父类
class 子类名(父类1,父类2,父类3,.....,父类n):
类内容体
多继承:一个类继承多个类。按照顺序从左到右依次继承(优先级从左到右依次降低)
多继承中如果父类有同名方法或属性,先集成的优先级高于后继承
pass关键字:pass是占位符,保证函数或者方法或者说类定义的完整性,表示无内容,空的意思


# 定义一个基类Phone,包含IMEI(未初始化)、producer属性和一个方法call_by_4g  
class Phone:  
    IMEI = None  
    producer = "HH"  
  
    def call_by_4g(self):  
        print("4g")  
  
# 定义一个从Phone类继承的子类phone2022,添加了一个face_id属性和一个方法call_by_5g  
class phone2022(Phone): 
    face_id = "10001"  
  
    def call_by_5g(self):  
        print("2022年新功能,5g通话")  
  
# 创建phone2022类的实例p,并调用其方法  
p = phone2022()  
print(p.producer)  # 输出:"HH",继承自基类Phone  
p.call_by_4g()     # 输出:"4g",继承自基类Phone  
p.call_by_5g()     # 输出:"2022年新功能,5g通话"  
  
# 多继承  
class NFCReader:  
    nfc_type = "第五代"  
    producer = "HM"  # 这里也定义了一个producer属性  
  
    def read_card(self):  
        print("NFC读卡")  
  
    def write_card(self):  
        print("NFC写卡")  
  
class RemoteControl:  
    rc_type = "红外遥控"  
  
    def control(self):  
        print("红外遥控开启了")  
  

# 定义一个从Phone、NFCReader和RemoteControl类继承的子类Myphone  
class Myphone(Phone, NFCReader, RemoteControl):  
    pass  
  
# 创建Myphone类的实例ph,并调用其方法  
ph = Myphone()  
ph.call_by_4g()          # 输出:"4g",继承自基类Phone  
ph.control()             # 输出:"红外遥控开启了",继承自RemoteControl  
ph.read_card()           # 输出:"NFC读卡",继承自NFCReader  
ph.write_card()          # 输出:"NFC写卡",继承自NFCReader  

复写

# 定义一个基类 Phone  
class Phone:  
    # IMEI 是一个类变量,目前被设置为 None  
    IMEI = None  
    # produser 是一个类变量,表示生产厂商,被设置为 "ITCAST"  
    produser = "ITCAST"  
  
    # 定义一个方法 call_by_5g,该方法在被调用时打印一条消息  
    def call_by_5g(self):  
        print("使用5g网络进行通话")  
  
# 定义一个从 Phone 类继承的子类 Myphone  
class Myphone(Phone):  
    # Myphone 类重写了 produser 类变量,将其设置为 "ITHEIMA"  
    produser = "ITHEIMA"  
  
    # Myphone 类重写了 call_by_5g 方法,该方法在被调用时打印多条消息  
    def call_by_5g(self):  
        print("开启CPU单核模式,确保通话的时候省电")  
        print("使用5g网络进行通话")  
        print("关闭CPU单核模式,确保性能")  
  
# 创建一个 Myphone 类的实例 ph  
ph = Myphone()  
  
# 打印 ph 实例的 produser 属性,由于 Myphone 类重写了该属性,所以将输出 "ITHEIMA"  
print(ph.produser)  
  
# 调用 ph 实例的 call_by_5g 方法,由于 Myphone 类重写了该方法,所以将执行 Myphone 类中的 call_by_5g 方法  
ph.call_by_5g()  

class Phone:  
    IMEI = None  
    produser = "ITCAST" #没有丢失,可以使用 
  
    def call_by_5g(self):  
        print("使用5g网络进行通话")  
  

调用父类同名成员


# 接着定义子类Myphone,它继承自Phone类  
class Myphone(Phone):  
    produser = "ITHEIMA"  
  
    def call_by_5g(self):  
        print("开启CPU单核模式,确保通话的时候省电")  
          
        # 方法1:直接通过父类名调用父类的方法  
        # 注意:这里我们调用了Phone类中的call_by_5g方法  
        Phone.call_by_5g(self)  
          
        # 方法2:使用super()调用父类的属性和方法  
        # 首先,我们打印了父类中的produser属性值  
        print(f"父类的厂商是:{super().produser}")  
        # 接着,我们调用了父类中的call_by_5g方法  
        super().call_by_5g()  
          
        print("关闭CPU单核模式,确保性能")  
  
# 创建Myphone类的实例  
ph = Myphone()  
  
# 打印Myphone实例的produser属性,将输出"ITHEIMA",因为子类重写了这个属性  
print(ph.produser)  
  
# 调用Myphone实例的call_by_5g方法,将执行Myphone类中的call_by_5g方法  
ph.call_by_5g()

类型注解

在代码中涉及数据交互的地方,提供数据类型的注解(显示说明)

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

支持

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

注意事项

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

# 基础数据类型注解
var_1: int = 10
var_2: str = "w"
var_3: bool = True
# 类对象类型注解
class Student():
    pass
stu: Student =Student ()

# 基础容器类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1,2,3)
my_dict: dict = {"s": 9}

# 容器详细类型注解
my_list1: list[int] =[1,2,3]
my_tuple1: tuple[int, str, bool] = (1, "2", True)
my_dict1: dict[str, int] = {"s": 9}
print(my_tuple1)

var_4 = 10     # type: int
var_5 = "10"   # type: str
var_6 = True   # type: bool

方法类型注解

对形参做的类型注解,写代码会自动的进行代码补全的提示

Union联合类型注解

  • 使用Union[类型,.....,类型]
  • 可以定义联合类型注释

多态

同样的行为(函数),传入不同的对象,得到不同的状态

抽象类

class AC:  
    def cool_wind(self):  
        """制冷"""  
        pass  
      
    def hot_wind(self):  # 修正了方法名的大小写,使其与类Midea_AC和GREE_AC中的方法名一致  
        """制热"""  
        pass  
      
    def swing_l_r(self):  
        """左右摆风"""  
        pass  
  
class Midea_AC(AC):  
    def cool_wind(self):  
        print("美的空调核心制冷科技")  
  
    def hot_wind(self):  # 修正了方法名的大小写  
        print("美的空调电热丝加热")  
  
    def swing_l_r(self):  
        print("美的空调无风感左右摆风")  
  
  
class GREE_AC(AC):  
    def cool_wind(self):  
        print("格力空调变频省电制冷")  
  
    def hot_wind(self):  # 修正了方法名的大小写  
        print("格力空调电热丝加热")  
  
    def swing_l_r(self):  
        print("格力空调静音左右摆风")  
  
def make_cool(ac: AC):  # 移除了 self 参数  
    ac.cool_wind()  
  
midea_ac = Midea_AC()  
gree_ac = GREE_AC()  # 调用构造函数创建实例  
  
make_cool(midea_ac)  
make_cool(gree_ac)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值