1、类
类的定义和实例化:
class ClassName(): # 类的定义
def __init__(self): # 初始化,类似构造函数
...
my_class = ClassName() # 实例化
例:
class Car(): # 类名首字母通常为大写
def __init__(self, make, year):
self.makes = make
self.years = year
self.odometers = 0 # 给属性指定默认值
def get_name(self):
long_name = self.makes + ' ' + str(self.years) + ' ' + str(self.odometers) + ' meters'
return long_name.title()
my_car = Car('audi', 2016)
print(my_car.get_name())
输出:
Audi 2016 0 Meters
解析:
(1)方法__init__()
特殊的方法,每当创建实例时Python都会自动调用它。该方法的名称的开头和结尾各有两条下划线。
(2)self
在此方法中形参self必不可少,必须位于其他形参的前面。当调用__init__()方法来创建实例时,将自动传入实参self,不需要再传入。类的方法与普通的函数只有一个特别的区别——类方法必须包含参数 self,且为第一个参数。每个与类相关的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
(3)属性
在__init__()中以self为前缀的变量都可供类中的所有方法使用,还可以通过类的任何实例来访问这些变量,像这样可通过实例访问的变量称为属性。还可以在该方法中给属性指定默认值,当类在实例化的时候没传入实参,则使用该默认值。
下划线、双下划线、头尾双下划线说明:
- __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
- _foo:以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
- __foo:双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
Python内置类属性:
- __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
- __doc__ :类的文档字符串
- __name__: 类名
- __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
- __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
你可以使用以下函数的方式来访问属性:
- getattr(obj, name[, default]) : 访问对象的属性。
- hasattr(obj,name) : 检查是否存在一个属性。
- setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
- delattr(obj, name) : 删除属性。
2、继承
类的继承:
class SubClass(Parentclass): # 子类SubClass继承自父类Parentclass
def __init__(self):
super().__init__() # 初始化父类的属性,此处没有self
...
例:类ElectricCar继承自类Car
class Battery():
def fill_gas(self):
print("fill gas = 120")
class ElectricCar(Car): # 继承自Car
def __init__(self, make, year):
super().__init__(make, year) # 初始化父类的属性,此处没有self
self.init_meters = 0
self.battary = Battery()
def get_name(self): # 重写父类方法
print("Name = Electric Car")
my_elecCar = ElectricCar('tesla', 2016)
my_elecCar.get_name()
my_elecCar.battary.fill_gas()
输出:
Name = Electric Car
fill gas = 120
注:
(1)定义子类时,必须在括号内指定父类的名称。
(2)super()是一个特殊函数,帮助Python将父类和子类关联起来。super().__init__(make, year)让Python调用ElectricCar的父类方法__init__(),让ElectricCar实例包含父类的所有属性。父类也称为超类(superclass),名称super因此而得名。
(3)子类重写父类的方法(同名)时,当有调用子类的该方法时,则父类的该方法不会被调用。
3、导入类
在一个模块中(.py文件中)定义好类后则在另一个模块中可以通过导入类来使用该模块中的类。
(1)从一个模块中导入多个类
from module_name import Class0, Class1 # 导入多个类时使用逗号分隔开
my_class = Class0() # 实例化
(2)导入整个模块
import module_name
my_class = module_nam.Class_name() # 实例化
(3)导入模块中的所有类
from module_name import *
注:不推荐此种方法导入模块中的所有类,可能导致名称冲突。
例:从一个模块(car.py)中导入多个类
from car import Battery,ElectricCar
my_elecCar = ElectricCar('tesla', 2016)
my_elecCar.get_name()
my_elecCar.battary.fill_gas()
例:导入整个模块(car.py)
import car
my_eleCar = car.ElectricCar('tesla', 2016) # 实例化是需要模块名
my_eleCar.get_name()
例:导入标准库
from collections import OrderedDict # 类似字典的类,可记录key_values添加顺序
favorite_languges = OrderedDict()
favorite_languges['Jan'] = 'Python'
favorite_languges['Phil'] = 'C'
for name, language in favorite_languges.items():
print(name.title() + " favorite languges is " + language.title())
输出:
Jan favorite languges is Python
Phil favorite languges is C