9.类
面向对象的。类可用于创建和表示对象,编写类后可以创建表示特定对象的实例。
9.1创建类与实例
class Dog():
'''模拟小狗'''
def _init_(self,name,age):
'''初始化属性'''
self.name =name
self.age=age
类的首字母大写(如Dog),小写的名称(如my_dog)指的是根据类创建的实例。类中的函数成为方法。
方法__init__()是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突
每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
9.2 使用类和实例
- 使用默认值
class Car():
def __init__(self,make,model,year):
'''初始化汽车的属性'''
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_description_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.')
my_car = Car('audi','a4',2016)
print(my_car.get_description_name())
my_car.read_odometer()
- 修改属性的值
3.1 直接通过实例修改
通过实例直接访问该属性并设置
例如my_car.odometer_reading = 23
3.2 通过方法进行设置
无需访问属性,使用方法更新属性
class Car():
...snip...
def update_odometer(self,mileage):
'''更新里程,禁止里程表回调'''
if mileage > self.odometer_reading:
self.odometer_reading = mileage
else:
print('不能修改')
my_car.update_odometer(23)
3.3 通过方法递增
需要将属性值递增特定的量
def increment_odometer(self,miles):
'''将里程表增加特定的量'''
self.odometer_reading +=miles
练习9_5
class User():
def __init__(self,first_name,last_name):
self.first_name = first_name
self.last_name = last_name
self.login_attempts = 0
def describe_user(self):
print(self.first_name+self.last_name)
def greet_user(self):
full_name = self.first_name+self.last_name
print('hello '+full_name)
def increment_login_attempts(self):
'''将属性登录次数增加1'''
self.login_attempts += 1
def reset_login_attempts(self):
'''将属性登录次数重置为0'''
self.login_attempts = 0
jack = User('jack','kadan')
jack.describe_user()
jack.greet_user()
jack.increment_login_attempts()
print(jack.login_attempts)
jack.reset_login_attempts()
print(jack.login_attempts)
9.3 继承
子类继承父类的所有属性和方法,同时还可以定义自己的属性和方法。父类是原有的类,新类称为子类。
- 子类的方法_init_()
class ElectricCar(Car):
'''电动汽车的独特之处'''
def __init__(self,make,model,year):
'''初始化父类的属性'''
super()._init_(make,model,year)
创建子类时,父类必须包含在当前文件,且位于子类的前面。
定义子类时,必须在括号内指定父类的名称。
函数==super()==关联父类与子类,代码行 super()._init_(make,model,year)
使程序调用父类的方法_init_(),让ElectricCar包含父类的所有属性。
- 给子类定义属性与方法
class ElectricCar(Car):
'''电动汽车的独特之处'''
def __init__(self,make,model,year):
'''初始化父类的属性'''
super(ElectricCar, self).__init__(make,model,year)
self.battery_size = 70
def describe_battery(self):
print('This car has a '+str(self.battery_size)+'-kwh battery.')
my_tesla = ElectricCar('tesla','model s',2016)
my_tesla.describe_battery()
-
重写父类的方法
在子类中定义一个同名方法,在调用时,Python会调用子类的方法定义,即子类会覆盖父类的同名方法。 -
将实例用作属性
将类的一部分提取出来作为一个独立的类,例如电动汽车里的电池可以单独做一个类Battery
class Battery():
def __init__(self,battery_size=70):
self.battery_size = battery_size
def describe_battery(self):
print('This car has a '+str(self.battery_size)+'-kwh battery.')
class ElectricCar(Car):
'''电动汽车的独特之处'''
def __init__(self,make,model,year):
'''初始化父类的属性'''
super(ElectricCar, self).__init__(make,model,year)
self.battery = Battery() #==创建一个Battery实例==
my_tesla = ElectricCar('tesla','model s',2016)
my_tesla.battery.describe_battery()
描述电瓶时需要使用属性battery,代码行为my_tesla.battery.describe_battery()
在ElectricCar类中,self.battery = Battery()
,创建一个Battery实例并将其存储在属性battery中
即每个ElectricCar实例都包含一个Battery实例。
9.4 导入类
将类存储在模块中,并在主程序中导入需要的模块。
当我们导入一个模块时,Python 解释器会执行该模块的所有顶层代码(即非函数或类定义等,直接执行的代码),这些代码包括变量初始化、函数定义、类定义以及运行顶层可执行代码等。这些代码都会在模块导入时执行,因此在导入模块时,它们也会被执行。
如果希望只导入模块中的特定代码而不运行其他代码,可以考虑将这些代码定义到函数或类中,并在需要时手动调用它们。这样可以避免自动运行其他不需要的代码。
导入模块中的类 from model import class1,class2
导入模块中所有的类from model import *
导入整个模块import model
from random import randint
class Die():
def __init__(self,sides):
'''类的属性'''
self.sides = 6
def roll_die(self):
'''扔骰子10次'''
numbers = []
count = 0
while count < 10:
numbers.append(randint(1, self.sides))
count += 1
print(numbers)
x = Die(6)
x.roll_die()
y = Die(10)
y.roll_die()
出现错误TypeError: Die() takes no arguments
检查方法__init__()下划线是两个
Python Module of the Week:要了解Python标准库,一个很不错的资源是网站Python Module of the Week。请访问http://pymotw.com/
在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。
需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句,再添加一个空行,然后编写导入你自己编写的模块的import语句。