您的位置:首页 > 编程语言 > Python开发

Python之类

2017-03-15 12:46 134 查看
面相对象编程是最有效的的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,你定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。使用面向对象编程可模拟现实情境,其逼真程度达到了令你惊讶的地步。

创建和实用类

使用类几乎可以模拟任何东西。下面来编写一个表示小狗的简单类Dog——它表示的不是特定的小狗,而是任何小狗。对于大多数宠物狗,我们都知道些什么呢?名字、年龄、会蹲下以及打滚。

创建Dog类

dog.py

class Dog():      #类的首写字母要大写
#self形参必不可少,它是一个指向实例本身的引用
def __init__(self,name,age):   #开头和末尾有两个下划线
self.name = name #以self为前缀的变量都可供类中的所有方法使用,我们可以通过类的任何实例来访问这些变量
self.age  = age

def sit(self):
#模拟小狗蹲下
print(self.name.title()+" is now sitting.")

def roll_over(self):
#模拟小狗打盹
print(self.name.title()+" rolled over!")


根据类创建实例

下面来创建一个表示特定小狗的实例;

class Dog():
---snip----
my_dog = Dog('Jack',8)
my_dog.sit()
my_dog.roll_over()
print("小狗的年龄:"+str(my_dog.age))


输出结果:



修改属性的值

直接修改属性的值

要修改属性的值,最简单的方式是通过实例直接修改它。

例如:

class Dog():
---snip----
my_dog = Dog('Jack',8)
my_dog.sit()
my_dog.roll_over()
print("小狗的年龄:"+str(my_dog.age))
my_dog.age = 9
print("小狗的年龄:"+str(my_dog.age))


输出结果:



通过方法修改属性的值

如果有替你更新属性的方法,将大有裨益。这样你无需直接访问属性,而可将值传递给一个方法,由它在内部进行更新。

例如:

class Dog():
---snip----
def update_age(self,modify_age):
self.age = modify_age
my_dog = Dog('Jack',8)
my_dog.sit()
my_dog.roll_over()
print("小狗的年龄:"+str(my_dog.age))
my_dog.update_age(9)
print("小狗的年龄:"+str(my_dog.age))


输出结果:



继承

编写类时,并非总是要从将空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法,同时还可以定义自己的属性和方法。

子类的方法_init_()

创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法_init_()需要父类施以援手。

例如,基于以上的案例,模拟黑色的小狗,它具备小狗所有的功能:

class Dog():
---snip----
class BlackDog(Dog):
#黑色小狗的独特之处
def __init__(self,name,age):
super().__init__(name,age)
self.color = 'black'

my_dog = BlackDog('Jack',8)
my_dog.sit()
my_dog.roll_over()
print("小狗的年龄:"+str(my_dog.age))
my_dog.update_age(9)
print("小狗的年龄:"+str(my_dog.age))
print("小狗的颜色:"+my_dog.color)


输出结果:



重写父类的方法

对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法。而只关注你在子类中定义的相应的方法

假如,黑色的狗不会蹲下

class Dog():
---snip----
class BlackDog(Dog):
#黑色小狗的独特之处
def __init__(self,name,age):
super().__init__(name,age)
self.color = 'black'
def sit(self):
print("黑色的狗不会蹲下")

my_dog = BlackDog('Jack',8)
my_dog.sit()


输出结果:



导入类

随着你不断地给类添加功能,文件可能变得很长,即便你妥善地使用了继承亦如此。为遵循Python的总体理念,应该让文件尽可能整洁。为在这方面提供帮助,Python允许你将类存储在模块中,然后再主程序中导入所需要的模块。

导入单个类

首先定义一个Dog类,该类包含dog属性和方法(行为)。

class Dog():      #类的首写字母要大写
#self形参必不可少,它是一个指向实例本身的引用
def __init__(self,name,age):    #开头和末尾有两个下划线
self.name = name     #以self为前缀的变量都可供类中的所有方法使用,我们可以通过类的任何实例来访问这些变量
self.age  = age

def sit(self):
#模拟小狗蹲下
print(self.name.title()+" is now sitting.")

def roll_over(self):
#模拟小狗打盹
print(self.name.title()+" rolled over!")
def update_age(self,modify_age):
self.age = modify_age


下面创建一个my_dog.py,使其导入Dog类并创建实例

from dog import Dog
my_dog = Dog('Jack',8)
my_dog.sit()
my_dog.roll_over()
print("小狗的年龄:"+str(my_dog.age))
my_dog.update_age(9)
print("小狗的年龄:"+str(my_dog.age))


输出结果:



注意:

可以从一个模块导入多个类

from dog import Dog,BlackDog


也可以导入整个模块

from dog


Python标准库

Python标准库是一组模块,安装Python都包含它。你现在对类的工作原理已有大致了解,可以使用其他程序员编写的模块了。

字典让你能够将信息关联起来,但他们不记录你添加键-值对的顺序。要创建字典并记录其中的键-值对的添加顺序,可使用模块collections中的OrderdDict类。

例如:

from collections import OrderedDict

favorite_languges = OrderedDict()
favorite_languges['苏林东'] = 'Python'
favorite_languges['程菲']   = 'C'
favorite_languges['杨明']   = 'C++'

for name,value in favorite_languges.items():
print(name.title()+"最喜欢的编程语言:"+value.title()+'.')


输出结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: