python基础-类
类基础
创建一个类
# 类的首字母一定要大写
class Dog():
# 每当创建新实例时,都会自动执行
def __init__(self, name, age):
# 初始化属性
self.name = name
self.age = age
def sit(self):
print(self.name.title() + '已经坐下了')
def roll(self):
print(self.name.title() + '打滚')
mydog = Dog('华晨宇',5)
mydog.sit()
在py中,首字母大写指的就是类。
类中的函数称为方法。__init__是一个特殊方法,每次Dog类创建新实例时,py都会自动运行它,前后的下划线是一个约定。避免与普通方法冲突。
__init__方法必须在形参中定义self,且必须位于第一个参数,位于其他参数前面。
PY调用__init__创建Dog实例时,将自动传入实参self,每个与类相关联的方法调用都自动传递实参self,他是一个指向实例本身的引用。让实例能够访问类找那个的属性和方法。
__init__并没有显示的return,py会自动返回一个实例,一般使用大写单词,比如Dog代表类,使用小写名称代表创建的类的实例。
print(mydog.name)
创建多个实例
mydog = Dog('花花',5)
yourdog = Dog('fuck', 36)
print(mydog.name)
print(yourdog.age)
使用类和实例
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def get_desc_name(self):
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
my_car = Car('nissan', 'xtral', 2021);
print(my_car.get_desc_name())
给属性指定默认值
def __init__(self, make, model, year):
self....
# 指定默认值
self.odometer_reading = 0
可以通过外部直接修改
my_car = Car('nissan', 'xtral', 2021);
my_car.odometer_reading = 23
print(my_car.odometer_reading)
也可以使用内部方法修改
def update_odometer(self, meter):
self.odometer_reading = meter
在外部使用
my_car.update_odometer(23)
每次调用方法时候,对odometer_reading属性递增指定值
def increment_odometer(self, meter):
self.odometer_reading += meter
继承
一个类继承另一个类的时候,将获得另一个类的所有属性和方法,原有类叫做父类,新类叫做子类。子类还可以定义自己的属性和方法。
比如,新建一个电车类,继承父类Car
父类
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
# 指定默认值
self.odometer_reading = 0
def get_desc_name(self):
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def update_odometer(self, meter):
self.odometer_reading = meter
def increment_odometer(self, meter):
self.odometer_reading += meter
子类
class ElectricCar(Car):
def __init__(self, make, model, year):
# 初始化父类的属性
super().__init__(make, model, year)
mytesla = ElectricCar('tesla', 'model s', 2016)
print(mytesla.get_desc_name())
创建子类实例时,py首先需要就是给父类的所有属性赋值。
注意,创建子类时,父类必须包含在当前文件中,且位于子类前面,并且class 子类(父类名称): 必须在括号内指定父类名称
super()是一个特殊函数,让py将子类和父类关联起来,父类也叫做超类。
为电车类定义一个属于自己子类的方法
class ElectricCar(Car):
def __init__(self, make, model, year):
# 初始化父类的属性
super().__init__(make, model, year)
# 为电车电量赋予初始值
self.battery_size = 70
def desc_battery(self):
print('电量还剩余: ' + str(self.battery_size))
重写父类方法
只要子类中定义一个与父类方法同名的方法,那么子类中的方法就把父类中的同名方法覆盖掉了。
将实例用作属性
随着代码编写,发现类文件越来越长,这时候可以将类的一部分作为一个独立的类提取出来。比如,上面那个电车类,针对电池,可以单独提出来做个类,然后在电车类中引用。
class Barrery():
def __init__(self, battery_size=70):
self.battery_size = battery_size
def desc_battery(self):
print('电量还剩余: ' + str(self.battery_size))
class ElectricCar(Car):
def __init__(self, make, model, year):
# 初始化父类的属性
super().__init__(make, model, year)
self.barrery = Barrery()
mytesla = ElectricCar('tesla', 'model s', 2016)
# 调用实例化类中的方法
mytesla.barrery.desc_battery()
导入类
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_desc_name(self):
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def update_odometer(self, meter):
self.odometer_reading = meter
def increment_odometer(self, meter):
self.odometer_reading += meter
然后再创建一个my_car.py,在其中导入Car类
from car import Car
mycar = Car('nissan', 'tiida', 2016)
print(mycar.get_desc_name())
mycar.odometer_reading = 55
print(mycar.odometer_reading)
在一个模块中存储多个类
class Car():
def __init__(self, make, model, year):
self.....
class Barrery():
def __init__(self, battery_size=70):
self....
class ElectricCar(Car):
def __init__(self, make, model, year):
# 初始化父类的属性
super().__init__(make, model, year)
self.....
在my_car.py中引用
from car import ElectricCar
mybyd = ElectricCar('byd', '秦', 2024)
print(mybyd.get_desc_name())
从一个模块中导入多个类
from car import Car, ElectricCar
mybyd = ElectricCar('byd', '秦', 2024)
print(mybyd.get_desc_name())
mynissan = Car('nissan', 'xtral', 2021)
print(mynissan.get_desc_name())
运行结果:
2024 Byd 秦
2021 Nissan Xtral
导入整个模块
还可以导入整个模块,然后使用句点法访问需要的类。
# 指的是car.py
import car
mybyd = car.ElectricCar('byd', '秦', 2024)
print(mybyd.get_desc_name())
mynissan = car.Car('nissan', 'xtral', 2021)
print(mynissan.get_desc_name())
导入模块中多有类
from module_name import *
from car import *
在一个模块中导入另一个模块
我们将电车类,与电池类单独放在一个模块中,electric_car.py
from car import Car
class Barrery():
...
class ElectricCar(Car):
def __init__(self, make, model, year):
# 初始化父类的属性
super().__init__(make, model, year)
....
这里如果不引入Car,那么就会报错。
在主程序my_car.py中
from car import Car
from electric_car import ElectricCar
mybyd = ElectricCar('byd', '秦', 2024)
print(mybyd.get_desc_name())
mynissan = Car('nissan', 'xtral', 2021)
print(mynissan.get_desc_name())
使用哪个类就单独引入哪个。
类的编码风格
类名采用驼峰命名法,不使用下划线,实例名和模块名都采用小写格式,用下划线分割。
类中使用一个空行分隔方法,模块中使用两个类分隔类。
import标准库与自己的类的时候,之间用空行分离。
import 标准库
#中间空行
from 自己的文件 import 自己的类
每个类、每个模块都应该添加文档字符串,描述类和模块的功能。