9.类
9.1创建类
9.1.1定义类
类是一种用户自定义的数据类型,它可以表示具有相同属性和方法的对象的集合。在创建类的实例之前,需要先定义类。类通常使用关键字class来定义,类名通常使用首字母大写的驼峰命名法,类的定义一般包括属性和方法。简单示例如下:
class MyClass:
#类的属性
my_attribute = 0
#类的方法
def my_method(self):
print('Hello world!')
9.1.2类的方法
类中的函数称为方法,有关函数的一切都适用于方法,唯一的差别是调用方法的方式。在类中定义方法时,需要在方法名前面添加一个self参数,它代表实例本身。在9.1.1的示例中,my_method是一个类的方法,它可以通过实例来调用。
在类中,有一个特殊的方法,即__init__(),它是在创建类之后通常会自动创建的一个方法。注意,在方法的名称中开头和末尾各有两个下划线。另外,init()方法必须包含一个名为self的参数,且必须位于其他形参的前面。,这个参数是实例本身的应用,可以用来访问类中的属性和方法。在__init__()方法中,可以设置实例的初始状态,定义实例的行为和行为规则。
现在我们来创建一个小狗类,在其中存储小狗的名字和年龄,并且赋予每条小狗蹲下和打滚的能力。示例如下:
class Dog:
def __init__(self,name,age):
#获取与形参name相关联的值并将其赋值给变量name
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!')
9.1.3根据类创建实例
在完成类的定义后,实际上并不会立即创建一个实例。这就像是一份汽车的蓝图。蓝图可以展示汽车的外观,但本身并不是一辆汽车。你无法直接驾驶蓝图,它只能用来指导真正汽车的建造,而且可以用它来制造多个汽车实例。**类的实例化:在创建类的实例时,需要使用类名来调用。**简单示例如下:
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!')
#创建一个名为my_dog的类的实例,并将它分配给变量my_dog
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.")
1、访问属性
使用句点表示法来访问属性。例如在上例中访问my_dog的属性name的值所使用的代码为;
my_dog.name
在这里,python会先找到实例my_dog,再查找与该实例相关联的属性name。对于上例,输出结果为:
My dog's name is Willie.
My dog is 6 years old.
2、调用方法
调用方法同样还是使用句点表示法。具体操作为:指定实例的名称和要调用的方法,并用句点分隔。对于上述创建的Dog类,调用坐下和打滚方法,示例如下:
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!')
#创建一个名为my_dog的类的实例,并将它分配给变量my_dog
my_dog = Dog('Willie',6)
my_dog.sit()
my_dog.roll_over()
此时python会在Dog类中查找方法sit()和roll_ove()并运行其代码。输出结果为:
Willie is now sitting.
Willie rolled over!
3、创建多个实例
可以根据需求创建任意数量的实例,例如对于Dog类再创建一个your_dog的小狗实例:
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!')
my_dog = Dog('Willie',6)
your_dog = Dog('Tom',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"Your dog's name is {your_dog.name}.")
print(f"Your dog is {your_dog.age} years old.")
your_dog.sit()
输出结果为:
My dog's name is Willie.
My dog is 6 years old.
Willie is now sitting.
Your dog's name is Tom.
Your dog is 3 years old.
Tom is now sitting.
9.2使用类和实例
9.2.1给属性指定默认值
创建实例时,有些属性无须通过形参来定义,可在方法__init__()中为其指定默认值。示例如下:
class Car:
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
#添加名为odometer_reading的属性,其初始值总为0
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = f'{self.year} {self.make} {self.model}'
return long_name.title()
#添加名为read_odometer的方法
def read_odometer(self):
print(f'This car has {self.odometer_reading} miles on it.')
my_new_car = Car('audi','a4','2019')
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
输出结果为:
2019 Audi A4
This car has 0 miles on it.
9.2.2修改属性的值
1、直接修改属性的值
最简单的方法就是通过实例直接访问它。示例如下:
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.')
my_new_car = Car('audi','a4','2019')
print(my_new_car.get_descriptive_name())
#直接讲里程表读数设置更改为23
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
此时输出结果已经变为:
2019 Audi A4
This car has 23 miles on it.
2、通过方法修改属性的值
使用update方法,示例如下:
class Car:
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
#添加名为odometer_reading的属性,其初始值总为0
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = f'{self.year} {self.make} {self.model}'
return long_name.title()
#添加名为read_odometer的方法
def read_odometer(self):
print(f'This car has {self.odometer_reading} miles on it.')
def update_odometer(self,mileage):
self.odometer_reading = mileage
my_new_car = Car('audi','a4','2019')
print(my_new_car.get_descriptive_name())
#使用update
my_new_car.update_odometer(23)
my_new_car.read_odometer()
此时输出结果第一种方法。
3、通过方法对属性的值进行递增
有时候需要将属性值递增特定的量,而不是将其设置为全新的值。示例如下:
class Car:
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
#添加名为odometer_reading的属性,其初始值总为0
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):
self.odometer_reading = mileage
#新增方法接受一个单位为英里的数
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(23500)
my_used_car.read_odometer()
my_used_car.increment_odometer(100)
my_used_car.read_odometer()
输出结果如下:
2015 Subaru Outback
This car has 23500 miles on it.
This car has 23600 miles on it.