python编程从入门到实践第九章——类

相关文章链接:

python编程从入门到实践第二章——变量和简单数据类型

python编程从入门到实践第三章——列表简介

python编程从入门到实践第四章——操作列表

python编程从入门到实践第五章——if语句

python编程从入门到实践第六章——字典

python编程从入门到实践第七章——用户输入和while循环

python编程从入门到实践第八章——函数

python编程从入门到实践第十章——文件和异常​​​​​​​

9.1 创建和使用类

9.1.1 创建Dog类

class Dog:                                        1⃣️
    """一次模拟小狗的简单尝试"""                      2⃣️
    
    def __init__(selfsame,age):                   3⃣️
        """初始化属性name和age。"""
        self.name = name                          4⃣️
        self.age =age

    def sit(self):                                5⃣️
        """模拟小狗收到命令时蹲下"""
        print(f"{self.name} is now sitting.")
    
    def roll_over(self):
        """模拟小狗收到命令时打滚"""
        print(f"{self.name} rolled over!")

1⃣️处定义了一个名为Dog的类。在Python中,首字母大写的名称指的是类。2⃣️处编写了一个字符串文档,对这个类的功能做了描述。

方法__init__()

类中的函数称为方法。3⃣️处的方法__init()是一个特殊方法,每当你根据Dog类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,旨在避免Python默认方法与普通方法名称冲突。

将__init()__定义成包含三个形参:self、name和age。形参self必不可少,而且必须位于其他形参的前面。因为Python调用这个方法创建Dog实例时,将自动传入实参self。每个与实例相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

每当根据Dog类创建实例时,都只需要给最后两个形参(name和age)提供值。

4⃣️处定义的两个变量都有前缀self。

self.name = name获取于形参name相关联的值,并将其赋值给变量name,然后通过该变量被关联到当前创建的实例。这样可以通过实例访问的变量称为属性

9.1.2 根据类创建实例

class Dog:                                        
    """一次模拟小狗的简单尝试"""                      
    
    def __init__(selfsame,age):                   
        """初始化属性name和age。"""
        self.name = name                          
        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)                    1⃣️
print(f"My dog's name is {my_dog.name}")   2⃣️
print(f"My dog's age is {my_dog.age}")     3⃣️


#My dog's name is Willie
#My dog's age is 6

1、访问属性

要访问实例的属性,可使用句点表示法。2⃣️处编写了如下代码来访问my_dog的属性name的值。

my_dog.name

2、调用方法

要调用方法,可指定实例的名称(这里是my_dog)和要调用的方法,并用句点分隔。

my_dog.sit()
my_dog.roll_over()

#Willie is now sitting.
#Willie rolled over!

3、创建多个实例

可按需求根据类创建任意数量的实例。

class Dog:                                        
    """一次模拟小狗的简单尝试"""                      
    
    def __init__(selfsame,age):                   
        """初始化属性name和age。"""
        self.name = name                          
        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)
your_dog = Dog('Lucy',3)

print(f"My dog's name is {my_dog.name}")
print(f"Your dog's name is {your_dog.name}")

#My dog's name is Willie
#Your dog's name is Lucy

9.2 使用类和实例

9.2.1 Car类

class Car"
    """一次模拟汽车的简单尝试"""
    
    def __init__(self, make,model,year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year

    def get_descritive_name(self):
        """返回整洁的描述性信息"""
        long_name = f"{self.year} {self.make} {self.model}"
        return long_name.title()
my_new_car = Car('audi','a4',2019)
print(my_new_car.get_descritive_name())

#2019 Adui A4

9.2.2 给属性指定默认值

创建实例时,有些属性无须通过形参来定义,可在方法__init__()中为其指定默认值。

class Car"
    """一次模拟汽车的简单尝试"""
    
    def __init__(self, make,model,year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descritive_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.")

my_new_car = Car('audi','a4',2019)
print(my_new_car.get_descritive_name())
my_new_car.read_odometer()

#2019 Adui A4
#This car has 0 miles on it.

 9.2.3 修改属性的值

三种方式修改属性的值:直接通过实例进行修改通过方法进行设置通过方法进行递增(增加特定的值)

1、直接修改属性的值

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

#2019 Audi A4
#This car has 23 miles on it. 

 2、通过方法修改属性

如果有方法能替你更新属性,将大有裨益。这样就无须直接访问属性,而可将值传递给方法,由它在内部进行更新。

def update_odometer(self, mileage):
    """将里程表读数设置为指定的值"""
    self.odometer_reading = mileage

my_new_car.update_odometer(23)
my_new_ca.ead_odometer()

#2019 Audi A4
#This car has 23 miles on it

3、通过方法对属性的值进行递增

有时候需要将属性值递增特定的量,而不是将其设置为全新的值。

def increment_odometer(self, miles):
    """将里程表读数增加指定的量。"""
    self.odometer_reading += miles

my_used_car = Car('subaru','outback',2015)
print(my_used_car.get_descriptive_name())

my_used_car.update_odometer(23500)
my_used_car.read_odometer()

my_used_car.increment_odometer(100)
my_used_car.read_odometer()

#2015 Subaru Outback
#This car has 23500 miles on it.
#This car has 23600 miles on it.

9.3 继承

一个类继承另一个类时,将自动获得另一个类的所有属性和方法原有的类称为父类而新类称为子类子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。

9.3.1 子类的方法__init__()

calss 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 on odometer!")

    def incement_odometer(self,miles):
        self.odometer_reading += miles

class ElectricCar(Car):
    """电动汽车的独特之处"""

    def __init__(self, make,model,year):
        """初始化父类的属性。"""
        super().__init__(make,model,year)

my_tesla = ElecticCar('Tesla','model s','2019)
print(my_my_tesla.get_descriptive_name())

#2019 Tesla Model S

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

定义子类时,必须在圆括号内指定父类的名称。方法__init__()接受创建Car实例所需的信息。

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

9.3.2 给子类定义属性和方法

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

calss 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 on odometer!")

    def incement_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_tesla = ElecticCar('Tesla','model s','2019)
print(my_my_tesla.get_descriptive_name())
my_tesla.describe_battery()

#2019 Tesla Model S
#This car has a 75-kwh battery.

9.3.3 重写父类的方法

对于父类的方法,只要它不符合子类模拟的实物的行为,都可以进行重写。为此,可在子类中定义一个与要重写父类方法同名的方法。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。

class ElectricCar(Car):
    
    def fill_gas_tank(self):
        """电动车没有油箱"""
        print("This car does't need a gas tank!")

9.3.4 将实例用作属性

使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。这种情况下,可能需要将类的一部分提取出来,作为一个独立的类

9.4 导入类

允许将类存储在模块中,然后在主程序中导入所需的模块

9.4.1 导入单个类

创建另一个文件my_car.py。在其中导入Car类并创建其实例:

from car import Car

my_new_car = Car('audi','a4',2019)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_regarding = 23
my_new_car.read_odometer()

#2019 Audi A4
#This car has 23 miles on it 

导入类是一种有效的编程方式。通过将这个类移到一个模块并导入该模块,依然可以使用其所有功能,但主程序文件变得整洁而易于阅读。

 9.5 Python标准库

Python标准库是一组模块,我们安装的Python都包含了它。

模块random,它在模拟很多实际情况时很有用。在这个模块中,一个有趣的函数时randint()。它将两个整数作为参数,并随机返回一个位于这两个整数之间的整数

from random import randint
randint(1,6)

#3

在random中,另一个有用的函数时chocie(),它将一个列表或元组作为参数,并随机返回其中的一个元素。

from random import choice
player = ['Charles','Martina','Michael','Florence','Eli']
first_up = choice(playes)
first_up

#'Florence'

9.6 类编码风格

类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白天数糖晚上数羊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值