目录
- 1. 类和方法的概念
- 2. 类的定义
- 3. 类的继承
- 4. 重写父类的方法
1. 类和方法的概念
- 类:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。举个例子,狗类就是狗的集合,每条狗都是狗类的具体实例,而且每条狗都会打滚,吐舌头这样的技能,也就是狗类的方法,并且每条狗都有自己的狗龄,也就是狗类的属性。
- 方法:类中定义的函数。
- 类的构造方法__init__():类有一个名为 init() 的特殊方法(构造方法),该方法在类实例化时会自动调用。
- 实例化:创建一个类的实例,类的具体对象。比如狗类创建某条名为xx的狗狗,这个xx的狗狗就是狗类的实例也就是具体对象。
- 属性: 类中的变量。
2. 类的定义
class 类名:
def __init__(self, 属性名):
"""属性"""
self.属性名1 = 属性名1
self.属性名2 = 属性名2
def 方法1(self):
"""类的方法1"""
def 方法2(self):
"""类的方法2"""
例如:
class Dog:
"""狗类"""
def __init__(self, name, age):
"""狗类的属性"""
self.name = name
self.age = age
def sit(self):
"""狗类的方法1"""
print(f"{self.name} is now sitting.")
def roll_over(self):
"""狗类的方法2"""
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"My dog is {my_dog.age} years old.")
my_dog.sit()
print(f"\nYour dog's name is {your_dog.name}.")
print(f"Your dog is {your_dog.age} years old.")
your_dog.sit()
这一段代码是创建Dog类,方法__init__()定义成了包含三个形参:self、name和age。在这个方法的定义中,形参self必不可少,还必须位于其他形参的前面。因为Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
创建Dog实例时,Python将调用Dog类的方法__init__()。我们将通过实参向Dog()传递名字和年龄;self会自动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。
然后是创建对象,类的实例化,并且调用方法。
3. 类的继承
类的继承相当于儿子继承了父亲的遗产。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
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
my_used_car = Car('subaru', 'outback', 2015)
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()
这段代码是创建了一个车类,车类的属性是车的制造商、制造年份、类型、里程数。车类的方法是描述车的基本信息、显示车的里程、设置车的里程和车的里程增加。
接下来是车类的实例化,产生了my_used_car这个对象,并且设置车的制造商、类型和年份。然后调用方法显示车的基本信息。然后设置车的里程数,并且显示,最后增加里程数并且显示。
然后是继承,创建一个ElectricCar类,继承Car类。
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)
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()
创建子类时,父类必须包含在当前文件中,且位于子类前面。
然后定义了子类ElectricCar。定义子类时,必须在括号内指定父类的名称。方法__init__()接受创建Car实例所需的属性。
super()是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用ElectricCar的父类的方法__init__(),让ElectricCar实例包含父类的所有属性。父类也称为超类(superclass),名称super因此而得名。
并且添加了新属性self.battery_size,并设置其初始值(如70)。根据ElectricCar 类创建的所有实例都将包含这个属性,但所有Car实例都不包含它。然后,还添加了一个名为describe_battery()的方法,它打印有关电瓶的信息。
然后创建ElectricCar类的一个实例,并将其存储在变量my_tesla中。这行代码调用ElectricCar类中定义的方法__init__(),后者让Python调用父类Car中定义的方法__init__()。
4. 重写父类的方法
对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,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
def fill_gas_tank(self):
"""汽车油箱"""
print("This car has a gas tank!")
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.")
def fill_gas_tank(self):
"""电动汽车没有油箱"""
print("This car doesn't need a gas tank!")
my_tesla = ElectricCar('tesla', 'model s', 2019)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
my_tesla.fill_gas_tank()
在这个代码中父类Car中有一个fill_gas_tank()方法,显示油箱,子类ElectricCar中不需要油箱,于是重写这个方法,显示没有油箱。