创建和使用类
面向对象式编程中,创建类可以模拟许多对象
这里我们以创建Dog类为例
class Dog: """A simple attempt to model a dog.""" def __init__(self, name, age): """Initialize name and age attributes.""" self.name = name self.age = age def sit(self): """Simulate a dog sitting in response to a command.""" print(f"{self.name} is now sitting.") def roll_over(self): """Simulate rolling over in response to a command.""" print(f"{self.name} rolled over!")
用Dog类模拟狗的一些特性,输出狗的名字
_init_()
类中的函数称为方法,上面代码中的方法是一种特殊方法,当根据Dog类创建新实例的时候,python会自动运行它,注意这个方法的名称前后都有两个下划线,这是为了区分其他的方法,所以使用这个方法的时候无比确保名称书写正确,否则导致程序错误。
__init__方法定义包含三个形参:self,name,age.在这个方法的定义中,self十分重要,必须位于其它形参的前面。python调用这个方法创建Dog实例的时候,将自动传入实参self,每个于实例相关联的方法调用都将自动传递实参self,他是一个指向实例本身的引用,让实例能够访问类中的属性和方法。在类中的其它自定义函数中也要引入形参self
self.name定义的两个变量都有以self为前缀,以self为前缀的变量可以供类中的所有方法使用,可以通过类的任何实例访问。self.name=name可以可以获取于name相关的值,并将其赋给变量name,这样可以通过实例访问的变量成为实例
根据类创建实例
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()
使用类是通常将类名称写为大写,类创建的实例写为小写
1.访问属性
my_dog.name
在实例中,使用实例名称.变量来访问实例的属性;而在类中,则改为类名称。
2.调用方法
my_dog.sit()
3.创建多个实例
my_dog = Dog('Willie', 6)
your_dog = Dog('Lucy', 3)
重复该语法
使用类和实例
Car类
class Car: """A simple attempt to represent a car.""" def __init__(self, make, model, year): """Initialize attributes to describe a car.""" self.make = make self.model = model self.year = year self.odometer_reading = 0 指定默认值 def get_descriptive_name(self): """Return a neatly formatted descriptive name.""" long_name = f"{self.year} {self.make} {self.model}" return long_name.title() my_new_car = Car('subaru', 'outback', 2015) print(my_new_car.get_descriptive_name())
给属性指定默认值
创建实例时,有些属性无需通过形参定义,可以在__init__()中为其指定默认值(见代码框)
修改属性的值
1.直接修改属性的值
my_new_car = Car('subaru', 'outback', 2015) print(my_new_car.get_descriptive_name()) my_new_car.odometer_reading = 23 修改属性的值
2.通过方法修改属性的值
class Car(): --snip-- def update_odometer(self, mileage): """将里程表读数设置为指定的""" self.odometer_reading = mileage my_new_car = Car('audi', 'a4', 2016) print(my_new_car.get_descriptive_name()) my_new_car.update_odometer(23) my_new_car.read_odometer()
这里定义了update_odometer()的方法来更新属性的值
3.通过方法对属性的值进行递增
class Car(): --snip-- def update_odometer(self, mileage): --snip-- def increment_odometer(self, miles): """将里程表读数增加指定的量""" self.odometer_reading += miles my_used_car = Car('subaru', 'outback', 2013) print(my_used_car.get_descriptive_name()) my_used_car.update_odometer(23500) my_used_car.read_odometer() my_used_car.increment_odometer(100) my_used_car.read_odometer()
继承
如果要编写的类时另一个现成类的特殊版本,可使用继承。一个类继承另一个类。自动获得另一个类的所有属性和方法。原有的类称为父类。子类继承父类的属性和方法,同时,子类可以定义自己的属性和方法。
子类的方法__init__()
编写新类时,要调用父类的__init__()方法
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 = 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 i") 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) my_tesla = ElectricCar('tesla', 'model s', 2016) print(my_tesla.get_descriptive_name())
创建子类时,父类必须包含在当前文件夹,即父类在前面。定义子类时,圆括号类要指定父类的名称。super()是一个特殊的函数,让你能够调用父类的方法
导入类
导入单个类
在同一个文件夹下创建两个文件,其中car.py用于存储Car类,另一个my_car.py用于存储实例代码
car.py:
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 = 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): """将里程表读数增加指定的量""" self.odometer_reading += miles
在这个文件中,较为完整的囊据了Car类的属性以及方法
my_car.py
from car import Car my_new_car = Car('audi', 'a4', 2016) print(my_new_carget_descriptive_name()) my_new_car.odometer_reading = 23 my_new_car.read_odometer()
这个文件的第一句导入了Car类模块
在一个模块中存储多个类
"""一组用于表示燃油汽车和电动汽车的类""" class Car(): --snip-- class Battery(): """一次模拟电动汽车电瓶的简单尝试""" def init (self, battery_size=60): """初始化电瓶的属性""" self.battery_size = battery_size def describe_battery(self): """打印一条描述电瓶容量的消息""" print("This car has a " + str(self.battery_size) + "-kWh battery.") def get_range(self): """打印一条描述电瓶续航里程的消息""" if self.battery_size == 70: range = 240 elif self.battery_size == 85: range = 270 message = "This car can go approximately " + str(range) message += "miles on a full charge." print(message) class ElectricCar(Car): """模拟电动汽车的独特之处""" def __init__(self, make, model, year): """初始化父 类的属性,再初始化电动汽车特有的属性""" super().__init__(make, model, year) self.battery = Battery()
从一个模块中导入多个类
from car import Car,ElectricCar
导入整个模块
import car
导入模块中的所有类
from model_name import *
此方法不建议
使用别名
from car import Car as other_name