一、类
通过搭配类与函数,可以写出优美的封装代码
面向对象编程,编写类时,定义了一个大类的对象都有的通用行为
① 创建类
在python中 类的首字母约定俗成为大写
在python2.7中,需要在class Dog(object)中添加object
类中的所有属性在实例化时必须有初始值,可以赋0或者赋空
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
self.weight = 0
def sit(self):
print(self.name.title() + " is sitting now.")
def roll_over(self):
print(self.name.title() + " rolled over!")
def show_weight(self):
print(self.weight)
def update_weight(self,weight):
self.weight = weight
1.方法
类中的函数被称作方法
__init__是一个特殊的方法,带下划线是因为要避免和普通方法起冲突,在每个类开头都需要写这个
self为指向实例本身的引用,是自动传入参数,在类中,可以通过调用self来访问类中的属性和方法
② 根据类创建实例
类是一类事物的通用模型,可以通过通用模型来创造具体的个体
1.创建实例
可以通过类创建一系列的有相同属性与行为特征的类,比如斑点狗与田园犬
my_dog = Dog("Hans", 8)
print("My dog's name is " + my_dog.name.title() + " and its age is " + str(my_dog.age) + " years old.")
2.访问实例的属性、方法(函数)
实例有它的属性以及一些内置在类,为实例所拥有的方法(函数)
print(my_dog.name)
my_dog.sit()
3.修改属性
直接修改属性值
my_dog.weight = 30
print(my_dog.weight)
通过方法(类内函数)修改属性
这样可以方便对一些不合理的调整属性的命令,使之不能直接修改属性而需要通过方法,在方法中对修改值作限制
def update_weight(self,weight):
self.weight = weight
二、类的继承
类可以有它的父类,子类继承了父类的所有属性与方法,同时还有自己的属性和方法
首先需要在定义子类的括号中添加父类作为参数,因为__init__方法会用到父类的信息
父类也被称为超类(super class),super()用于联系父类和子类
① 类继承的基本模式
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
self.weight = 0
def sit(self):
print(self.name.title() + " is sitting now.")
def roll_over(self):
print(self.name.title() + " rolled over!")
def show_weight(self):
print(self.weight)
def update_weight(self,weight):
self.weight = weight
class ChinesePastoralDog(Dog):
def __init__(self, name, age):
super().__init__(name, age)
self.color = "Blue"
def show_color(self):
print(self.color)
my_dog = Dog("Hans", 8)
print("My dog's name is " + my_dog.name.title() + " and its age is " + str(my_dog.age) + " years old.")
herman_dog = ChinesePastoralDog("puper", 23)
herman_dog.show_color()
② 重写父类的方法
父类的一些方法在子类中是无效的,比如汽车需要加油,而电动汽车不需要
在子类中以父类方法同样的名称,对代码进行重写
def roll_over(self):
print(" ChinesePastoralDog can not roll over!")
herman_dog.roll_over()
ChinesePastoralDog can not roll over!
③ 类的嵌套:将类生成的实例用作另一个类的属性
在中华田园犬类外,另设了一个类专门用于毛色属性与毛色相关的方法,将毛色的类实例化,并将这个实例作为中华田园犬类中的一个属性,相当于类的嵌套
class ChinesePastoralDog(Dog):
def __init__(self, name, age):
super().__init__(name, age)
self.color = Color()
def color_about(self):
self.color.present_color()
def roll_over(self):
print("CPD can not roll over!")
class Color():
def __init__(self, color="Blue"):
self.color = color
def present_color(self):
print(self.color)
herman_dog = ChinesePastoralDog("puper", 23)
herman_dog.color_about()
三、类模块的导入与导出
类可以单独作为一个模块,也可以多个类放在同一个模块里,处理方式与函数的模块导入导出类似
以Class_Car.py文件作为Car类及其子类的模块为例子,其中有子类 Electric Car 和 Fuel Car
① 类模块的导出
和函数一样,在定义完后保存在.py文件中
② 从类模块中调用类
调用Car类:
from Class_Car import Car
调用ElectricCar类:
from Class_Car import ElectricCar
③ 从类模块中调用多个类
调用ElectricCar类与 FuelCar类
from Class_Car import ElectricCar, FuelCar
调用Class_car.py模块文件下的所有类
import Class_Car
④ 类模块间有依赖关系的处理
当Car与Electric Car分别保存在不同模块时,如果调用Electric Car,也就是Car的子类,需要先从另一个模块调用它的父类Car
from Class_Car import Car
from Class_ElectricCar import ElectricCar