类是Python中所有数据的基础,在Python中所有东西都是一个对象,而类是定义对象的方式。它们是面向对象编程的基础,代表了你想在程序中建模的真实世界的东西。你用一个类来实例化对象,对象是一个类的具体实例。如果你有一个房子类,你可以从这个基类中创建一个殖民地对象、一个当代对象或一个木屋对象。一个类定义了整个类别的对象可能具有的一般行为,以及可以与这些对象关联的信息。类可以相互继承,这意味着你可以创建一个类来扩展一个现有类的功能。这在面向对象的Python中是非常常见的做法。
如何创建一个类
一个类通常是以名词为模型的。 类是事物。所以我们可以创建一个代表人、房子、车辆或动物的类。这些都是学习类时常用的例子。对我们来说,我们将创建一个车辆类。我们会把什么信息与车辆联系起来,它有什么行为?一个车辆可能有一个类型,品牌,型号等等。这种类型的信息存储在Python变量中,称为属性。这些东西也有行为。一辆汽车可以开车、停车、按喇叭,诸如此类。行为被包含在函数中,作为类的一部分的函数被称为方法。
一个车辆类
class Vehicle:
def __init__(self, brand, model, type):
self.brand = brand
self.model = model
self.type = type
self.gas_tank_size = 14
self.fuel_level = 0
def fuel_up(self):
self.fuel_level = self.gas_tank_size
print('Gas tank is now full.')
def drive(self):
print(f'The {self.model} is now driving.')
注意,在这个例子中,gas_tank_size 持有一个Python Number。
构建一个对象
一个类的实例被称为一个对象。它是通过调用类本身来创建的,就像它是一个函数一样。下面的代码传入三个Python字符串来创建一个新的车辆对象。
vehicle_object = Vehicle('Honda', 'Ridgeline', 'Truck')
访问属性值
print(vehicle_object.brand)
print(vehicle_object.model)
print(vehicle_object.type)
Honda
Ridgeline
Truck
调用方法
vehicle_object.fuel_up()
vehicle_object.drive()
Gas tank is now full.
The Ridgeline is now driving.
创建多个对象
vehicle_object = Vehicle('Honda', 'Ridgeline', 'Truck')
a_subaru = Vehicle('Subaru', 'Forester', 'Crossover')
an_suv = Vehicle('Ford', 'Explorer', 'SUV')
修改属性值
我们可以直接更新一个属性值,或者更好的是通过可以获取和设置属性值的方法。
直接修改一个属性
cool_new_vehicle = Vehicle('Honda', 'Ridgeline', 'Truck')
cool_new_vehicle.fuel_level = 7
定义一个方法来更新一个属性的值
class Vehicle:
def __init__(self, brand, model, type):
self.brand = brand
self.model = model
self.type = type
self.gas_tank_size = 14
self.fuel_level = 0
def fuel_up(self):
self.fuel_level = self.gas_tank_size
print('Gas tank is now full.')
def drive(self):
print(f'The {self.model} is now driving.')
def update_fuel_level(self, new_level):
if new_level <= self.gas_tank_size:
self.fuel_level = new_level
else:
print('Exceeded capacity')
定义一个方法来增加一个属性的值
class Vehicle:
def __init__(self, brand, model, type):
self.brand = brand
self.model = model
self.type = type
self.gas_tank_size = 14
self.fuel_level = 0
def fuel_up(self):
self.fuel_level = self.gas_tank_size
print('Gas tank is now full.')
def drive(self):
print(f'The {self.model} is now driving.')
def update_fuel_level(self, new_level):
if new_level <= self.gas_tank_size:
self.fuel_level = new_level
else:
print('Exceeded capacity')
def get_gas(self, amount):
if (self.fuel_level + amount <= self.gas_tank_size):
self.fuel_level += amount
print('Added fuel.')
else:
print('The tank wont hold that much.')
那么私有数据呢?
在许多语言中,有一个私有变量的概念,不能从类定义的外部访问。Python 没有这个功能。如果你希望你的类数据是私有的,你可以遵循惯例,在模块中使用前导下划线来声明私有变量、函数、方法和类。这实际上并没有强制执行隐私,但它确实给了阅读代码的人一个提示,这些项目是私有的,只能通过getter或setter方法访问。
类和对象的命名规则
在Python中,类名应该遵循UpperCaseCamelCase惯例。对象名称应该用小写,必要时用下划线作为分隔符。模块名称应该全部是小写,当需要多个单词时,应该用下划线将它们分开。如果可能的话,模块通常最好坚持使用1个字的名字。
类的继承
类的继承是面向对象编程的一个基本部分。它允许你通过驱动父类的属性和方法来扩展你的类。当一个类继承自另一个类时,它可以自动访问父类的所有属性和方法。你可以在子类中声明新的属性和方法,并重写父类的属性和方法。要从另一个类继承,在定义新类时要把父类的名字放在括号里。另外,请看继承之上的组合。
子类的 __init__() 方法
class ElectricVehicle(Vehicle):
def __init__(self, brand, model, type):
super().__init__(brand, model, type)
self.battery_size = 85
self.charge_level = 0
给子类添加新的方法
class ElectricVehicle(Vehicle):
def __init__(self, brand, model, type):
super().__init__(brand, model, type)
self.battery_size = 85
self.charge_level = 0
def charge(self):
self.charge_level = 100
print('The vehicle is now charged.')
def fuel_up(self):
print('This vehicle has no fuel tank!')
使用子类和父类的方法
electric_vehicle = ElectricVehicle('Tesla', 'Model 3', 'Car')
electric_vehicle.charge()
electric_vehicle.drive()
重写父类方法
class ElectricVehicle(Vehicle):
def __init__(self, brand, model, type):
super().__init__(brand, model, type)
self.battery_size = 85
self.charge_level = 0
def charge(self):
self.charge_level = 100
print('The vehicle is now charged.')
def fuel_up(self):
print('This vehicle has no fuel tank!')
作为属性的实例
你可以将一个类的实例存储在一个不同的类属性中。这使得类有可能一起工作来模拟复杂的情况。
一个电池类
class Battery:
def __init__(self, size=85):
self.size = size
self.charge_level = 0
def get_range(self):
if self.size == 85:
return 260
elif self.size == 100:
return 315
将一个类的实例存储在一个属性中
class ElectricVehicle(Vehicle):
def __init__(self, brand, model, type):
super().__init__(brand, model, type)
self.battery = Battery()
def charge(self):
self.battery.charge_level = 100
print('The vehicle is fully charged.')
使用实例
electric_vehicle = ElectricVehicle('Tesla', 'CyberTruck', 'Truck')
electric_vehicle.charge()
print(electric_vehicle.battery.get_range())
electric_vehicle.drive()
The vehicle is fully charged.
260
The CyberTruck is now driving.
导入类
当你增加特性和功能时,类文件的大小就会增长。为了使你的程序文件不至于杂乱无章,你可以将你的类存储在模块中,并根据需要将你需要的类导入你的主程序中。
在文件中存储类
vehicle.py
class Vehicle:
"""Vehicle Class data and methods"""
class Battery:
"""Batter Class data and methods"""
class ElectricVehicle(Vehicle):
"""ElectricVehicle Class data and methods"""
从一个模块中导入单个类
vehicle_objects.py
from vehicle import Vehicle, ElectricVehicle
a_mini = Vehicle('Cooper', 'Mini', 'Car')
a_mini.fuel_up()
a_mini.drive()
a_tesla = ElectricVehicle('Tesla', 'Model 3', 'Car')
a_tesla.charge()
a_tesla.drive()
导入整个模块
import vehicle
a_mini = Vehicle('Cooper', 'Mini', 'Car')
a_mini.fuel_up()
a_mini.drive()
a_tesla = ElectricVehicle('Tesla', 'Model 3', 'Car')
a_tesla.charge()
a_tesla.drive()
了解 **self**在 Python 中
你可以看到,一个方法的第一个参数总是 self.Self不是一个关键字,实际上你可以给这个第一个参数起任何你喜欢的名字。使用...确实很有意义。 **self**然而,这是一个惯例,建议你使用self,这样阅读你代码的人就会知道你在说什么。所以第一个参数是self,它是对对象的引用,而不是对类的引用。当一个对象从类中被创建时。 **self**将引用该对象。它提供了一种方法,使其他变量和对象在一个类中随处可见。该 **self**变量会自动传递给每个通过对象调用的方法,这就是为什么它被列在每个方法定义的第一位。连接到 **self**的变量可以在类中的任何地方使用。
理解 __init__()
**__init__()**方法是一个属于类的函数,就像其他方法一样。重要的是关于 **__init__()**重要的是,每次你从一个类中实例化一个新的对象时,它都会被自动调用。换句话说,它是一个构造函数。
在一个列表中存储对象
列表可以容纳很少或很多东西,只要你愿意。除了所有你可以存储在列表中的其他类型外,对象也可以被存储在列表中。让我们看几个例子来说明这一点。这里有一个例子显示如何实例化一组租赁车辆,并确保所有的车辆都可以驾驶。
一个租赁车辆的集合
from vehicle import Vehicle, ElectricVehicle
gas_fleet = []
electric_fleet = []
for _ in range(100):
vehicle = Vehicle('Honda', 'Civic', 'Car')
gas_fleet.append(vehicle)
for _ in range(50):
evehicle = ElectricVehicle('Nissan', 'Leaf', 'Car')
electric_fleet.append(evehicle)
for vehicle in gas_fleet:
vehicle.fuel_up()
for evehicle in electric_fleet:
evehicle.charge()
print(f'Gas vehicles: {len(gas_fleet)}')
print(f'Electric vehicles: {len(electric_fleet)}')
Python类的例子总结
如果你想在Python中进行面向对象编程,那么你需要很好地理解类的工作原理。在这组Python类的例子中,我们看了一下什么是类,如何创建和使用一个类,什么是实例属性,如何修改属性,如何使用继承,以及如何遵循正确的命名规则。