面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下。
创建和使用类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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 )
print ( "My dog's name is " + my_dog.name.title() + "." )
print ( "My dog is " + str (my_dog.age) + " years old." )
运行结果:
My dog's name is Willie.
My dog is 6 years old.
|
class关键字:来定义一个类。类名通常首字母为大写。
__init__方法:特殊方法,每当实例类的时候都会运行。其中的形参self必不可少,而且必须位于最前面。
self形参:类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候
用不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身。
实例的方法是指定类名以及需要传入的实参。
要访问实例的属性或者调用方法,可使用句点表示法。
使用类和实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class Car():
def __init__( self , make, model, year):
self .make = make
self .model = model
self .year = year
self .odometer_reading = 0 #<- here
def get_descriptive_name( self ):
long_name = str ( self .year) + ' ' + self .make + ' ' + self .model
return long_name.title()
def read_odometer( self ):
print ( "This car has " + str ( self .odometer_reading) + " miles on it." )
my_new_car = Car( 'audi' , 'a4' , 2016 )
print (my_new_car.get_descriptive_name())
my_new_car.read_odometer()
运行结果:
2016 Audi A4
|
可以看到,我们给Car类的属性指定了默认值self.odometer_reading = 0。如果要修改它,我们可以通过实例直接访问它并修改,比如:my_new_car.odometer_reading = 23。或者通过方法修改属性的值。或者通过方法对属性的值进行递增。
1
2
3
4
5
6
7
8
9
|
class Car():
- - snip - -
#通过方法修改属性的值
def update_odometer( self , mileage):
self .odometer_reading = mileage
#通过方法对属性的值进行递增
def increment_odometer( self , miles):
self .odometer_reading + = miles
|
继承
一个类继承另一个类时,他将自动获得另一个类的所有属性和方法;原有的类称为父类,新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
现在我们有一个Car类如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Car():
def __init__( self , make, model, year):
self .make = make
self .model = model
self .year = year
self .odometer_reading = 0 #<- here
def get_descriptive_name( self ):
long_name = str ( self .year) + ' ' + self .make + ' ' + self .model
return long_name.title()
def read_odometer( self ):
print ( "This car has " + str ( self .odometer_reading) + " miles on it." )
def update_odometer( self , mileage):
self .odometer_reading = mileage
def increment_odometer( self , miles):
self .odometer_reading + = miles
|
创建子类实例时,python首先给父类所有属性赋值。
接下来我们创建新类EleCar
1
2
3
4
5
6
7
8
9
10
11
12
|
class Car():
- - snip - -
class ElectricCar(Car):
def __init__( self , make, model, year):
super ().__init__(make, model, year)
my_tesla = ElectricCar( 'tesla' , 'model s' , 2016 )
print (my_tesla.get_descriptive_name())
运行结果:
2016 Tesla Model S
|
首先父类必须位于子类前面。
super()是一个特殊函数,将父类和子类关联起来。使得可调用子类的父类的方法__init__(),让子类包父类的所有属性。
给子类定义属性和方法没有任何限制,比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Car():
- - snip - -
class ElectricCar(Car):
def __init__( self , make, model, year):
super ().__init__(make, model, year)
self .battery_size = 70
def describe_battery( self ):
print ( "This car has a " + str ( self .battery_size) + "-kWh battery." )
my_tesla = ElectricCar( 'tesla' , 'model s' , 2016 )
print (my_tesla.get_descriptive_name())
my_tesla.describe_battery()
运行结果:
2016 Tesla Model S
This car has a 70 - kWh battery.
|
如果需要重写父类的方法,只需定义一个与重写的父类方法同名的方法即可。
python还可以使用其他类的实例作为自己类的属性。
导入类
类似函数,类也可以保存为.py文件形成模块从而进行导入。
导入单个类:
from model_name import class_name
导入一个模块的多个类:
from model_name import class_name1, class_name2
导入一个模块所有类:
from model_name import *
导入整个模块:
import model_name
还可以在一个模块中导入另一个模块
python标准库
其是一组模块。模块collections中有一个类OrderedDict。字典的键值对没有顺序,但是这个类几乎和字典相同,区别只在于记录了键值对的顺序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
from collections import OrderedDict
favorite_languages = OrderedDict()
favorite_languages[ 'jen' ] = 'python'
favorite_languages[ 'sarah' ] = 'c'
favorite_languages[ 'edward' ] = 'ruby'
favorite_languages[ 'phil' ] = 'python'
for name, language in favorite_languages.items():
print (name.title() + "'s favorite language is " +
language.title() + "." )
运行结果:
Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Ruby.
Phil's favorite language is Python.
|