一、类的基本概念
class Dog():
def __init__(self,name,age):
self.name=name
self.age=age
def sit(self):
print(self.name.title()+' is now
sitting.')
def roll_over(self):
print(self.name.title()+' rolled
over!')
my_dog=Dog('willie',6) #创建实例,在这里我们一般用命名约定:通常认为首字母大写的名称(比如这里的Dog)指的是类,而小写的名称(比如my_dog)指的是类创建的实例
my_dog.sit() #通过实例调用Dog中的sit()方法
my_dog.roll_over() #通过实例调用Dog中的roll_over()方法
1.在Python中,首字母大写的名称指的是类。
2.方法__init__()
类中的函数称作方法。
__init__()是一个特殊的方法,每当根据类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。
在上面的例子中,我们将__init__()方法定义成了包含三个形参:self、name和age。在这个方法的定义中,形参self必不可少,还必须位于其他形参前面。
为何在方法定义中包含形参self 呢。因为Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self 。每个与类相关联的方法调用都会自动传递参数self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
我们创建Dog实例时,Python将调用Dog类的方法__init__()。我们将通过实参向Dog()传递名字和年龄;self 会自动传递。
3.类中的每个属性都必须有默认值,哪怕这个值是0或者空字符串。
二、继承
1.子类的方法__init__
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
self.make=make
self.model=model
self.year=year
def get_descriptive_name(self):
"""返回整洁的描述性信息"""
long_name=str(self.year)+' '+self.make+' '+self.model
return long_name.title()
"""定义电动汽车继承汽车类"""
class ElectriCar(Car):
def __init__(self,make,model,year):
"""初始化父类的属性"""
super().__init__(make,model,year)
my_tesla=ElectriCar('tesla','models',2016)
"""调用父类的方法"""
print(my_tesla.get_descriptive_name())
(1)创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。
(2)创建子类时,父类必须包含在当前文件中,且位于子类前面。如上代码,我们定义了子类ElectriCar。定义子类时,必须在括号内指定父类的名称。
(3)super()是一个特殊的函数,帮助Python将父类和子类关联起来。这行代码让Python调用ElectriCar的父类的方法__init__(),让ElectriCar实例包含父类的所有属性。父类也成为超类(superclass),名称super因此而得名。
2.重写父类的方法
对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义这样一个方法,即它要与重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。
3.将实例用作属性
使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法的清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。
例如,不断给ElectriCar 类添加细节时,我们可能会发现其中包含很多专门针对汽车电瓶的属性和方法。在这种情况下,我们可将和谐属性和方法提取出来,放到另一个名为Battery的类中,并将Battery实例用作ElectriCar类的一个属性:
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 batery.")
接着在ElectriCar类中定义一个Battery实例属性,并可以直接用ElectriCar的实例调用Battery中的describe_battery()方法。
def __init__(self,make,model,year):
"""初始化父类的属性"""
super().__init__(make,model,year)
self.battery=Battery()
my_tesla.battery.describe_battery()
4.导入类
(1)从某个.py文件导入某个类,比如从car.py导入Car类,可以写成from car import Car
(2)从某个模块导入多个类,用逗号分分隔各个类。;例如:from car import Car,ElectricCar
(3)导入整个模块,import car
(4)导入模块中的所有类,from car import *
5.python标准库
Python标准库是一组模块,安装的Python都包含它。我们可使用标准库中的任何函数和类,只需要在程序的开头包含一I条简单的import语句。下面来看一个collections中的OrderedDict类。OrderedDict实例的行为几乎与字典相同,区别只在于记录了键值对的添加顺序。
from collections import OrderedDict
favorite_language=OrderedDict()
favorite_language['jen']='python'
favorite_language['sarah']='java'
favorite_language['edward']='php'
favorite_language['phil']='c'
for name,cname in favorite_language.items():
print(name.title()+' favorite language is '+ cname )