类——Python自学记录Day9

(class),并基于这些类来创建对象(object)。在编写类时,你要定义一批对象根据类来创建对象称为实例化,这让你能够使用类的实例(instance)。

📢:super()

目录

创建和使用类

创建Dog类

根据类创建实例

使用类和实例

给属性指定默认值

修改属性的值

直接修改属性的值

通过方法修改属性的值

通过方法让属性的值递增

继承

📢:父类必须包含在当前文件中,且位于子类前面。📢:super()

📢:给子类定义属性和方法

📢:重写父类中的方法

类的编程风格 

创建和使用类

创建Dog类

根据Dog类创建的每个实例都将存储名字和年龄,而且我们会赋予每条小狗坐下(sit())和打滚(roll_over())的能力:
📢:具体注意事项体现在代码注释中

lass Dog:#根据约定,在Python中,首字母大写的名称指的是类。 
    """一次模拟小狗的简单尝试"""
 #因为这是我们创建的全新的类,所以定义时不加括号。然后是一个文档字符串,对这个类的功能做了描述。
    def __init__(self, name, age): #类中的函数称为方法。
 #__init__()方法定义成包含三个形参:self、name和age。在这个方法的定义中,形参self必不可少,而且必须位于其他形参的前面。
 #每当我们根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。
        """初始化属性name和age"""
        self.name = name#像这样可通过实例访问的变量称为属性(attribute)。
        self.age = age

    def sit(self):
        """模拟小狗收到命令时坐下"""
        print(f"{self.name} is now sitting.")

    def roll_over(self):
        """模拟小狗收到命令时打滚"""
        print(f"{self.name} rolled over!")
根据类创建实例
my_dog = Dog('Willie', 6)

print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} years old.")
#在这里,命名约定很有用:通常可以认为首字母大写的名称(如Dog)指的是类,而全小写的名称(如my_dog)指的是根据类创建的实例。
my_dog.roll_over()
my_dog.sit()

使用类和实例

类编写好后,你的大部分时间将花在使用根据类创建的实例上。你需要完成的首要任务之一是,修改实例的属性。既可以直接修改实例的属性,也可以编写方法以特定的方式进行修改。

接下来会以car.py中创建Car的类 在注释中来体现一下具体内容的使用

  1. 给属性指定默认值
  2. 修改属性的值
    1. 直接修改属性的值
    2. 通过方法修改属性的值

      在类中写update_odometer(self, mileage):方法,在类外调用方法来改属性的值

    3. 通过方法让属性的值递增
lass 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): #2.通过方法修改属性的值##
        """将里程表读数设置为指定的值"""
        self.odometer_reading = mileage

    def increment_odometer(self, miles):#3.通过方法让属性的值递增##
        """让里程表读数增加指定的量"""
        self.odometer_reading += miles

my_new_car = Car('audi', 'a4', 2024)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23) #在类外调用方法来改属性的值
my_new_car.read_odometer()

###给属性指定默认值###
#在__init__方法中给默认值

###修改属性的值###
#可以用三种不同的方式修改属性的值:直接通过实例修改,通过方法设置,以及通过方法递增(增加特定的值)​。下面依次介绍这些方式。

    ##1.直接修改属性的值##
my_new_car.odometer_reading = 23

    ##2.通过方法修改属性的值##
    #在类中写update_odometer(self, mileage):方法
    #在类外调用方法来改属性的值

    ##3.通过方法让属性的值递增##    
my_used_car = Car('subaru', 'outback', 2019)
print(my_used_car.get_descriptive_name())

my_used_car.update_odometer(23_500)
my_used_car.read_odometer()

my_used_car.increment_odometer(100)
my_used_car.read_odometer()

继承

如果要编写的类是一个既有的类的特殊版本,可使用继承(inheritance)。原有的类称为父类(parent class),而新类称为子类(child class)。子类不仅继承了父类的所有属性和方法,还可定义自己的属性和方法。

📢:父类必须包含在当前文件中,且位于子类前面。
📢:super()

一个特殊的函数,让你能够调用父类的方法​。父类也称为超类(superclass),函数名super由此得名。

📢:给子类定义属性和方法
📢:重写父类中的方法

重写办法:在子类中定义一个与要重写的父类方法同名的方法。这样,Python将忽略这个父类方法,只关注你在子类中定义的相应方法。

具体使用在下面代码中体现:

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)
#super()是一个特殊的函数,让你能够调用父类的方法​。
#这行代码让Python调用Car类的__init__()方法,从而让ElectricCar实例包含这个方法定义的所有属性。
#父类也称为超类(superclass),函数名super由此得名。
        
        self.battery_size = 40
    ##给子类定义属性↑和方法↓##
    def describe_battery(self):
        """打印一条描述电池容量的消息"""
        print(f"This car has a {self.battery_size}-kWh battery.")
    

my_leaf = ElectricCar('nissan', 'leaf', 2024)
print(my_leaf.get_descriptive_name())
my_leaf.describe_battery()

类的编程风格 

编程规范需要注意以下几点:

  • 类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,并且不使用下划线
  • 实例名和模块名都采用全小写格式,并在单词之间加上下划线。
  • 对于每个类,都应在类定义后面紧跟一个文档字符串。这种文档字符串简要地描述类的功能,你应该遵循编写函数的文档字符串时采用的格式约定。每个模块也都应包含一个文档字符串,对其中的类可用来做什么进行描述。
  • 在类中,可以使用一个空行来分隔方法;而在模块中,可以使用两个空行来分隔类。
  • 先编写导入标准库模块的import语句,再添加一个空行,然后编写导入你自己编写的模块的import语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值