第九章 类

9.1创建和使用类

9.1.1创建Dog类

class Dog:
    def __init__(self, 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.!")

9.1.2根据类创建实例

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")

 1.访问属性

my_dog.name

2.调用方法

my_dog.sit()
my_dog.roll_over()

3.创建多个实例

my_dog = Dog("willie", 6)

my_dog.sit()
my_dog.roll_over()
your_dog = Dog("Lucy", 3)
print(f"Your dog's name is {your_dog.name}")
print(f"Your dog is {your_dog.age} years old")

9.2使用类和实例

9.2.1Car类

编写一个汽车类

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
    def get_descriptive_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_descriptive_name())

9.2.2给属性指定默认值

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

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer = 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} miles on it.")
my_new_car = Car("audi", "a4", "2019")
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()

9.2.3修改属性的值

1.直接修改属性的值

要修改属性的值,最简单的方式就是通过实例直接访问它。

my_new_car.odometer = 23
my_new_car.read_odometer()

2.通过方法修改属性的值

可以无须修改属性值,而是将值传递给方法,由方法在内部进行更新。

类内部添加:
def update_odometer(self, mileage):
    self.odometer = mileage
my_new_car.update_odometer(24)
my_new_car.read_odometer()

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

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

类内部添加:
def increment_odometer(self, miles):
    self.odometer += miles
my_new_car.increment_odometer(30)
my_new_car.read_odometer()

9.3继承

如果要编写的类是另外一个类的特殊版本,可使用继承

一个类继承另一个类时,将自动获得另一个类的所有方法和属性。原来的类叫做父类,新类称之为子类

9.3.1 子类的方法_init_()

编写新类时,将初始化在父类_init_()方法中定义的所有属性,从而让子类包含这些属性

在Car类的基础上创建新类ElectricCar

class ElectricCar(Car):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)
my_tesla = ElectricCar("tesla", "model s", "2019")
print(my_tesla.get_descriptive_name())

9.3.2给子类定义属性和方法

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

下面添加一个电动汽车特有的属性(电瓶),以及一个描述该属性的方法。

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 = ElectricCar("tesla", "model s", "2019")
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()

9.3.3重写父类的方法

对于父类的方法,只要他不符合子类模拟的实物的行为,都可以进行重写。

为此 ,可在子类中定义一个与要重写的父类方法同名的方法。

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

现在如果对电动汽车调用方法fill_gas_tank(),python将忽略car类中的方法fill_gas_tank()

9.3.4将实例用作属性

在给类添加的细节越来越多,属性和方法清单以及文件都会越来越长。在这种情况下,可将类的一部分提取戳来,作为一个独立的类。

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_size}-kwh battery.")
class ElectricCar(Car):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)
        self.battery = Battery()
my_tesla.battery.describe_battery()

根据电瓶容量报告汽车的续航里程。

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.")
    def get_range(self):
        if self.battery_size == 75:
            range = 260
        elif self.battery_size == 100:
            range = 315
        print(f"This car can go about {range} miles on a full charge")

9.3.5模拟实物

9.4导入类

9.4.1导入单个类

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer = 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} miles on it.")
    def update_odometer(self, mileage):
        self.odometer = mileage
    def increment_odometer(self, miles):
        self.odometer += miles

from car import Car    #从car.py中导入Car这个类

.........

9.4.2在一个模块中存储多个类

虽然在同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块中存储任意数量的类。

from car import ElectricCar

9.4.3从一个模块中导入多个类

可根据需要在程序文件中导入任意数量的类。

from car import Car,ElectricCar

9.4.4导入整个模块

还可以导入整个模块,再使用句点表示法访问需要的类。

import car
my_beetle = car.Car("volkswagen","beetle",2019)

9.4.5导入模块中的所有类

from module_name import *

9.4.6在一个模块中导入另一个模块

有时候,需要将类分散到多个模块中,以免模块太大或在同一个模块中存储不相关的类。

将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类。在这种情况下,可在前一个模块中导入必要的类

from car import Car

ElectricCar类需要访问其父类Car,因此在上处直接将Car类导入该模块中。

9.4.7使用别名

在程序中创建大量电动汽车时,需要反复输入ElectricCar,十分繁琐

为避免这种情况,可在import语句中指定一个别名。

from electric_car import ElectricCar as EC
my_tesla = EC("tesla", "roadster", 2019)

9.5python标准库

python标准库是一组模块,我们可以使用标准库中的任何函数和类。

from random  import randint
print(randint(1,6))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值