PyTorch基础教程(三)‘类’ of Python

目录

一、创建和使用类

1.创建 Plane 类 

2.根据类创建实例

(1)访问属性

(2)调用方法

(3)创建多个实例

二、继承

1.子类的方法__init__( )

2.给子类定义属性和方法

3.父类方法的重写

4.将实例用作属性

三、导入类

1.导入单个类

2.导入多个类

3.导入整个模块

4.使用别名


一、创建和使用

面向对象的编程,使用类可以模拟很多东西;

1.创建 Plane 类 

        通过创建 飞机 ,可以表示飞机的共同属性。对于大多数飞机都有着它独特(不强调独特,强调都有)的 名字 编号 ,并且几乎所有的飞机都有 起飞 着陆 两个动作;

        根据 Plane 创建的每个实例都将存储 名字 编号 ,并且赋予每个 plane 都具备起飞“ takeoff ( ) ”和着陆“ land ( ) ”的能力。

class Plane:
    '''模拟飞机'''
    
    def __init__(self,name,numbering):
        '''初始化属性 name 和 numbering '''
        self.name = name 
        self.numbering = numbering
        
    def takeoff (self):
        '''模拟飞机接收到命令时起飞'''
        print(f"{self.name} is now takeoff")
            
    def land (self):
        '''模拟飞机接收到命令时着陆'''
        print(f"{self.name} land now!")

约定 代表代码

讲解:

        定义了一个 Plane  。在 Python 中,首字母大写的名称指向

        编写文档字符串,对类的功能进行描述;

        __init__( ) 是一个特殊方法:每当根据 Plane 创建实例时,Python 都会自动运行它。其中,init 两边都有两条英文下划线,这是种约定。在这个方法定义中的 self 必不可少,并且必须位于首位。当 Python 调用这个方法来创建 Plane 实例时,将自动传入实参 self 。每个与实例相关联的方法调用都自动传递实参 self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。创建 Plane 实例时,Python 将调用 Plane  的方法 __init__( ) 。我们将通过实参Plane ( ) 传递名字编号self 会自动传递,因此不需要传递它。每当根据 Plane  创建实例时,都只需给最后两个形参name numbering)提供值。

        ⑥ ⑦ 两行代码定义的两个变量都有前缀 self 。以 self 为前缀的变量可供类中的所有方法所使用,可以通过类的任何实例来访问。self.name = name 获取与形参 name 相关联的值,并将其赋给变量 name ,然后该变量被关联到当前创建的实例。像这样可通过实例访问的变量成为属性

        

2.根据类创建实例

        可将 类 视为有关如何创建实例的 说明 

class Plane:
    '''模拟飞机'''
    
    def __init__(self,name,numbering):
        '''初始化属性 name 和 numbering '''
        self.name = name 
        self.numbering = numbering
        
    def takeoff (self):
        '''模拟飞机接收到命令时起飞'''
        print(f"{self.name} is now takeoff")
            
    def land (self):
        '''模拟飞机接收到命令时着陆'''
        print(f"{self.name} land now!")
        
my_plane = Plane('UAV',666666)   #创建一个实例,名称为 UAV ,编号为 666666 ,将实例赋给 UAV 变量

print(f'My plane name is {my_plane.name}.' ) 
print(f'My plane numbering is {my_plane.numbering}.' )   
  
#运行结果

My plane name is UAV.
My plane numbering is 666666.

说明:通过方法 __init__( ) 创建一个表示特定飞机的实例,并使用提供的值来设置属性 name numbering ,并将实例赋给变量 my_plane 。在约定中,大写字母开头的往往为 小写字母开头的,一般表示 实例

(1)访问属性

         访问实例属性,使用句点表示法

my_plane.name

(2)调用方法

         调用实例方法,同使用句点表示法

class Plane:
    '''模拟飞机'''
    
    def __init__(self,name,numbering):
        '''初始化属性 name 和 numbering '''
        self.name = name 
        self.numbering = numbering
        
    def takeoff (self):
        '''模拟飞机接收到命令时起飞'''
        print(f"{self.name} is now takeoff")
            
    def land (self):
        '''模拟飞机接收到命令时着陆'''
        print(f"{self.name} land now!")
        
my_plane = Plane('UAV',666666)   #创建一个实例,名称为 UAV ,编号为 666666 ,将实例赋给 UAV 变量

print(f'My plane name is {my_plane.name}.' ) 
print(f'My plane numbering is {my_plane.numbering}.' )   

my_plane.takeoff()
my_plane.land()
#运行结果

My plane name is UAV.
My plane numbering is 666666.
UAV is now takeoff
UAV land now!

(3)创建多个实例

说明:每个实例都存储在不同变量中,或者占用列表或字典的不同位置


二、继承

        情况:如果要编写的类是另一个现成类的特殊版本,可以使用继承。一个类继承另一个类时,将自动获得另一个类的所有属性和方法。原有类成为父类,新类称为子类。子类继承了父类的所有属性和方法,同时还定义自己的属性和方法

1.子类的方法__init__( )

说明:在既有类的基础上编写新类时,通常要调用父类的方法 __init__( ) 。这将初始化在父类 __init__( ) 方法中定义的所有属性,从而让子类包含这些属性

下面,通过电动汽车类汽车类的继承展开讲解:

class Car:

    def __init__(self,make,model,year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
        
    def get_descriptive_name(self):
        long_name = f"{self.year}{self.make}{self.model}"
        return long_name.title()
    
    def read_odometer(self):
        print(f"This car has {self.odometer_reading} miles on it.")
        
    def update_odometer(self,mileage):
        if mileage >=self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
            
    def increment_odometer(self,miles):
        self.odometer_reading += miles
        
class ElectricCar(Car):
    
    def __init__(self, make, model, year):
        '''初始化父类属性'''
        super().__init__(make, model, year)
        
my_car = ElectricCar('python3','pro','2023')
print(my_car.get_descriptive_name())
        
#运行结果

2023Python3Pro

说明

        创建子类时,父类必须包含在当前文件中,且位于子类前面。

        定义子类时,必须在圆括号内指定父类的名称。

        第 29 行代码处的 super ( ) 是一个特殊函数,让你能够调用父类方法。这行代码让 Python 调用 Car类 的方法__init__( ) ,让 ElectricCar 实例包含这个方法中定义的所有属性。父类也称为超类(superclass),名称 super 由此而来。

  有关 super ( ) 函数更深入的理解,请参考:【python】B站最细致的super()详解,一定有你不知道的知识!_哔哩哔哩_bilibili

2.给子类定义属性和方法

让一个类继承另一个类后,就可以添加区分子类的父类所需的新属性新方法了。

class Car:

    def __init__(self,make,model,year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
        
    def get_descriptive_name(self):
        long_name = f"{self.year}{self.make}{self.model}"
        return long_name.title()
    
    def read_odometer(self):
        print(f"This car has {self.odometer_reading} miles on it.")
        
    def update_odometer(self,mileage):
        if mileage >=self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
            
    def increment_odometer(self,miles):
        self.odometer_reading += miles
        
class ElectricCar(Car):
    
    def __init__(self, make, model, year):
        '''初始化父类属性'''
        super().__init__(make, model, year)
        self.battery_size = 75
        
    def describe_battery(self):
        '''打印一条描述电瓶容量的信息'''
        print(f'This car has a {self.battery_size}-kwh battery.')
        
my_car = ElectricCar('python3','pro','2023')
print(my_car.get_descriptive_name())
my_car.describe_battery()
#运行结果

2023Python3Pro
This car has a 75-kwh battery.

3.父类方法的重写

假设 Car 类 中有一个名为 fill_gas_tank ( ) 的方法,它对全电动汽车来说毫无意义。

class ElectricCar(Car):
    --snip--
    
    def fill_gas_tank(self):
        print("This car doesn't need a gas tank")

现在,如果再调用方法 fill_gas_tank ( )Python 将忽略 Car 类 中的方法 fill_gas_tank ( )

4.将实例用作属性

        可将类中的一部分提取出来,作为一个独立的类,从而将大型类拆分成多个协同工作的小类。

        例如:我们可以将电动汽车电瓶的属性和方法提取出来,放到一个新类 Battery ,并将一个 Battery 实例作为 ElectricCar 类属性

class Car:

    def __init__(self,make,model,year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
        
    def get_descriptive_name(self):
        long_name = f"{self.year}{self.make}{self.model}"
        return long_name.title()
    
    def read_odometer(self):
        print(f"This car has {self.odometer_reading} miles on it.")
        
    def update_odometer(self,mileage):
        if mileage >=self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
            
    def increment_odometer(self,miles):
        self.odometer_reading += miles
        
    
class Battery:
    def __init__(self,battery_size = 75):
        self.battery_size = battery_size
        
    def describe_battery(self):
        print(f'This car has a {self.battery_size} - kwh battery.')
        
class ElectricCar(Car):
    def __init__(self,make,model,year):
        super().__init__(make,model,year)
        self.battery = Battery()
        
my_car = ElectricCar('python3','pro','2023')
print(my_car.get_descriptive_name())
my_car.battery.describe_battery()
#运行结果

2023Python3Pro
This car has a 75 - kwh battery.

说明

        ① 第 26 行代码处,定义了一个名为 Battery 的新类,它没有继承任何类。

        ② 第 27 行代码处,方法 __init__( )self 外还添加了一个命名为 battery_size 的形参,默认值设为75,方法 describe_battery ( ) 也移到了这个类中。

        ③ 第36行代码处,创建一个新的 Battery 实例,并将该实例赋给属性 self.battery


三、导入类

        我们在文件 car.py 中定义 Car 类ElectricCar 类Battery 类,然后以下操作将会在其他文件里导入这些类。

1.导入单个类

from car import Car 

my_car = Car('python3','500','2023')

2.导入多个类

from car import Car,ElectricCar

my_car = Car('python3','500','2023')
my_new_car = ElectricCar('python3-new','500s','2023')

3.导入整个模块

import car

#导入整个模块 car ,使用句点表示法访问需要的类

my_car = car.Car('python3','500','2023')
my_new_car = car.ElectricCar('python3-new','500s','2023')

4.使用别名

from car import ElectricCar as EC

my_new_car = EC('python3-new','500s','2023')

说明:可以通过 import A as B 的方式将 原A 取一个新命名为 B

最新动态,请关注微信公众号回不去的明天 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

旗狼-回不去的明天

您的支持是对创作的最大鼓励!

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

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

打赏作者

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

抵扣说明:

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

余额充值