Python 入门日记(九)—— 类

2020.07.15 Python 入门的 Day8

成就:类及其模块化

  • 使用几乎可以模拟任何东西,根据类来创建对象被称为实例化
  • 下述代码是一个 Dog 类:
# 类中的函数被称为方法
class Dog():
    def __init__(self, name, age):
        self.name = name
        self.age = age
# 方法 __init__() 是一个特殊的方法
# 方法 __init__() 包含三个形参, self, name, age
# self 是必不可少的,并且必须在其他形参的前面
# self 是一个指向实例本身的引用,会自动传递
# 当我们根据 Dog 类去创建实例的时候,只需给最后两个形参提供值
# 以 self 为前缀的变量都可以供类中的所有方法使用
# 像这样可以通过实例访问的变量成为属性
    def sit(self):
        print(self.name.title() + 'is now sitting.')

    def roll_over(self):
        print(self.name.title() + " rolled over!")
  • 可将类视为如何创建实例的说明,下述代码是创建一个表示特定小狗的实例:
my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 3)
# 创建小狗
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
# 使用句点表示法访问实例的属性
my_dog.sit()
my_dog.roll_over()
your_dog.sit()
your_dog.roll_over()
# 使用句点表示法调用实例中的方法
  • 下述是一个创建表示汽车的类的代码:
class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
# self.odometer_reading 的默认值为0
    def get_descriptive_name(self):
        long_name = str(self.year) + " " + self.make + " " + self.model
        return long_name.title()

    def read_odometer(self):
        print("This car has " +
              str(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):
        if miles >= 0:
            self.odometer_reading += miles
        else:
            print("You can't roll back an odometer!")
  • 下述为三种修改属性的值的方法
my_new_car.odometer_reading = 23
# 第一种:直接修改属性的值
my_new_car.update_odometer(24)
# 第二种:编写更新属性的方法
my_new_car.increment_odometer(1)
# 第三种:通过方法对属性的值进行递增
  • 如果要编写的类是另一个现成的类的特殊版本,可用继承
  • 一个类继承另一个类时,会自动获得另一个类的属性和方法。
  • 原有的类称为父类超类),新的类称为子类
class ElectricCar(Car):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)
# 新的类 ElectricCar 继承了父类 Car
# super()是一个特殊的函数,将父类和子类关联起来

my_tesla = ElectricCar('tesla', "model s", 2016)
print(my_tesla.get_descriptive_name())
# 调用
  • 让一个类继承另一个类后,可添加新的属性和方法。
class ElectricCar(Car):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)
        self.battery_size = 70
# 新的属性
    def describe_battery(self):
        print("This car has a " +
              str(self.battery_size) +
              "-KWh battery.")

    def fill_gas_tank(self):
        print("This car donesn't need a gas tank!")
# 新的方法
  • 如果父类有不适用于子类的方法,可直接重写,调用子类的方法时 Python 会以新的为准。
  • 可以将类的一部分作为一个独立的类提取出来,将实例用作属性。
class Battery():
    def __init__(self, battery_size=70):
        self.battery_size = battery_size

    def describe_battery(self):
        print("This car has a " +
              str(self.battery_size) +
              "-KWh battery.")

class ElectricCar(Car):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)
        self.battery = Battery(100)
# self.battery 是一个 Battery 类的实例,也是 ElectricCar 类的一个属性

my_tesla.battery.describe_battery()
# 调用时用句号表示法
  • 类可作为一个模块被导入到一个文件中,样例如下:
from Car import Car
# 从 Car.py 里导入 Car 类
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
# 调用时正常使用

# 当然也可以直接导入整个模块(import Car)
# 但是调用时要用句号表示法加前缀
# 不推荐全部导入(from module_name import *)
  • Python 中有很多标准库,库中有很多封存的类,可以直接调用。
posted @ 2020-07-15 23:22  Tree。  阅读(148)  评论(0编辑  收藏  举报