一:创建和使用类
1、创建Dog类
根据Dog类创建的每个实例都将存储名字和年龄及行为能力,根据Python约定,首字母大写的名称指的是类。这个类定义中没有圆括号,因为要从空白创建这个类。
方法__init__()
类中的函数称为方法,方法__init__()是一个特殊方法,当类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和结尾各有两个下划线,旨在避免Python默认方法和普通方法发生名称冲突。在__init__()方法定义中形参self必不可少,而且必须位于其他形参的前面,Python在调用这个方法创建实例时,将自动传入实参self。每个与实例相关关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
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!")
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.")
# RESULT
'''
My dog's name is Willie.
My dog is 6 years old.
'''
(1)访问属性
my_dog.name
(2)调用方法
my_dog.sit()
my_dog.roll_over()
# RESULT
'''
Willie is now sitting.
Willie rolled over!
'''
二:使用类和实例
1、Car类
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def get_descriptive(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())
# RESULT
'''
2019 Audi A4
'''
2、给属性制定默认值
def __init__(self, make, model, year):
self.odometer_reading = 0
3、修改属性值
(1)直接修改属性值
my_new_car = Car('audi', 'a4', 2019)
my_new_car.odometer_reading = 20
(2)通过方法修改属性值
class Car:
def __init__(self, make, model, year):
self.odometer_reading = 0
self.make = make
self.model = model
self.year = year
def update_odometer(self, mileage):
self.odometer_reading = mileage
my_new_car = Car('audi', 'a4', 2019)
my_new_car.update_odometer(20)
三:继承
编写类时,并非总是要从空白开始。如果要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,将自动获得另一个类的所有属性和方法。原有的类称为父类,而新的类称为子类。子类继承父类的所有属性和方法,同时还可以定义自己的属性和方法。
1、子类的方法__init__()
在既有类的基础上编写新类时,通常要调用父类的方法__init__()。这将初始化在父类__init__()方法中定义的所有属性,从而让子类包含这些属性。
创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时,必须在圆括号内指定父类的名称。方法__init__()接受创建Car实例所需的信息。
super()是一个特殊函数,让你能够调用父类的方法。
class Car:
def __init__(self, make, model, year):
self.odometer_reading = 0
self.make = make
self.model = model
self.year = year
def get_descriptive(self):
long_name = f"{self.year} {self.make} {self.model} {self.odometer_reading}"
return long_name.title()
def update_odometer(self, mileage):
self.odometer_reading = mileage
class ElecCar(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
my_tesla = ElecCar('tesla', 'model s', '2022')
print(my_tesla.get_descriptive())
# RESULT
'''
2022 Tesla Model S 0
'''
2、给子类定义属性和方法
让一个类继承另一个类后,就可以添加区分子类和父类所需的新属性和方法。
class ElecCar(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 = ElecCar('tesla', 'model s', '2022')
print(my_tesla.get_descriptive())
my_tesla.describe_battery()
3、重写父类的方法
对于父类的方法,只要它不符合子类模拟的实物行为,都可以进行重写。为此,可在子类中定义一个与要重写的父类的方法同名的方法即可。
class Car:
def __init__(self, make, model, year):
self.odometer_reading = 0
self.make = make
self.model = model
self.year = year
def fill_gas_tank(self):
print("This car need a gas tank!")
class ElecCar(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
self.battery_size = 75
def fill_gas_tank(self):
print("This car doesn't need a gas tank!")
my_car = Car('audi', 'a6', '2022')
my_car.fill_gas_tank()
my_tesla = ElecCar('tesla', 'model s', '2022')
my_tesla.fill_gas_tank()
# RESULT
'''
This car need a gas tank!
This car doesn't need a gas tank!
'''
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}-KWh battery.")
class ElecCar(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
self.battery = Battery()
my_tesla = ElecCar('tesla', 'model s', '2022')
my_tesla.battery.describe_battery()
# RESULT
'''
This car has a 75-KWh battery.
'''
四:导入类
1、导入单个类
使用import语句让Python打开模块car并导入其中的Car类。
# car.py
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def get_descriptive(self):
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
# my_car.py
from car import Car
my_new_car = Car('audi', 'a4', 2022)
print(my_new_car.get_descriptive())
# RESULT
'''
2022 Audi A4
'''
2、在一个模块中存储多个类,导入多个类
可根据需要在程序文件中导入任意数量的类。导入时用逗号分隔各个类,导入必要的类后,可根据需要创建每个类的任意数量实例。
# car.py
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def get_descriptive(self):
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
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.")
class ElecCar(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
self.battery = Battery()
# my_car.py
from car import Car, ElecCar
my_car = Car('audi', 'a4', 2022)
print(my_car.get_descriptive())
my_tesla = ElecCar('tesla', 'roadster', '2022')
print(my_tesla.get_descriptive())
# RESULT
'''
2022 Audi A4
2022 Tesla Roadster
'''
3、导入整个模块
import car
my_car = car.Car('audi', 'a4', 2022)
print(my_car.get_descriptive())
my_tesla = car.ElecCar('tesla', 'roadster', 2022)
print(my_tesla.get_descriptive())
4、导入模块中的所有类
from module_name import *
from car import *
my_car = Car('audi', 'a4', 2022)
print(my_car.get_descriptive())
my_tesla = ElecCar('tesla', 'roadster', 2022)
print(my_tesla.get_descriptive())
print(my_tesla.battery.describe_battery())
# RESULT
'''
2022 Audi A4
2022 Tesla Roadster
This car has a 75-KWh battery.
None
'''