python基础-类和import
类基础
创建一个类
# 类的首字母一定要大写
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
从一个模块中导入某个指定的类
# 方法一
import matplotlib.pyplot as plt
# 方法二
from matplotlib import pyplot as plt
上面这两句代码的作用基本相同,都可以用于在 Python 里导入matplotlib
库的pyplot
模块,并且将其重命名为plt
,后续你就能够使用plt
来调用pyplot
模块里的各种绘图函数了。
import matplotlib.pyplot as plt
这是比较标准、推荐的导入方式。matplotlib
是一个庞大的可视化库,pyplot
是它众多子模块中的一个,专门用于创建各种绘图。这种导入方式明确表明了pyplot
来自matplotlib
库,代码的可读性更好
from matplotlib import pyplot as plt
这种导入方式同样能实现将pyplot
模块重命名为plt
来使用。但它是从matplotlib
库中直接导入pyplot
模块,省略了库名的显式引用。
两种导入方式在功能上是等价的,但在实际开发中,更建议使用import matplotlib.pyplot as plt
导入整个模块
还可以导入整个模块,然后使用句点法访问需要的类。
# 指的是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 自己的类
每个类、每个模块都应该添加文档字符串,描述类和模块的功能。