> 文档中心 > Python日记(6)

Python日记(6)


  • 面向对象编程过程中,编写表示现实世界中的事物和情景中的类,并基于这些类来创建对象,编写类时,你定义一大类对象都有的通用行为,根据类来创建对象被称为实例化,这让你能够使用类的实例。

创建和使用类

  • 创建Dog类
class Dog():def __init__(self,name,age):self.name=nameself.age=agedef sit(self):print(self.name.title()+'is now sitting.')def roll_over(self):print(self.name.title()+'rolled over.')

根据python中,首字母大写的的名称指的是类,这个类定义的括号是空的,因为我们要从空白创建这个类

方法_init_:类中的函数称为方法,_init_是一种特殊的方法,每当你根据这个类创建新实例时,python都会自动运行它,在这个名称方法中,开头和末尾各有一个双下划线(_为单下划线,_为双下划线),这是一种约定,旨在避免python默认方法与普通方法发生名称冲突,
方法中的self形参必不可少,还必须位于其他形参的前面。
当python调用这个_init
()方法来创建实例的时候,将自动传入实参self,每个与类相关联的方法调用都自动传递实参self,他是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
以self为前缀的变量都可以供类中的所有方法使用,也可以通过类的任何实例来访问这些变量,想这样可以可以通过实例访问的变量称为属性
传递参数不需要管self!

  • 根据类来创建实例
my_dog=Dog('cc',6)print("my dog's name is: "+my_dog.name.title())print("my dog's age is: "+str(my_dog.age))

如果报错:TypeError: Dog() takes no arguments,错误的地方就是将__init__写成了_init_,再着就是init拼写错误
Python日记(6)

  • 调用类中的方法:
my_dog.sit()my_dog.roll_over()创建多个实例:my_dog=Dog('cc',6)your_dog=Dog('aa',12)
  • 使用类和实例:
class Car():def __init__(self,make,model,year):self.make=makeself.model=modelself.year=yeardef get_descriptive_name(self):long_name=str(self.year)+' '+self.make+' '+self.modelreturn long_name.title()my_new_car=Car('audi','f4',2000)print(my_new_car.get_descriptive_name())

Python日记(6)

  • 给属性指定默认值
class Car():def __init__(self,make,model,year):self.make=makeself.model=modelself.year=yearself.f=0def get_descriptive_name(self):long_name=str(self.year)+' '+self.make+' '+self.modelreturn long_name.title()def read_f(self):print('this car has '+str(self.f))my_new_car=Car('audi','f4',2000)my_new_car.read_f()print(my_new_car.get_descriptive_name())

如果对某个属性这样做了,就无需包含为它提供初始值的形参

修改属性的值

  • 1.直接修改属性的值
my_new_car.f=5
  • 2.通过方法修改属性的值
def update_f(self,mi):self.f=mimy_new_car.update_f(22)
  • 3.通过方法对属性的值进行递增
def insert_f(self,num):self.f+=nummy_new_car.update_f(22)my_new_car.insert_f(100)

继承

继承编写类时,并非总要从空白开始,如果你要编写的类是另一个形成类的特殊版本,可以使用继承。一个类继承另一个类时,他将自动获得另一个类的所有方法和属性,原有的类称为父类,新类称为子类,子类继承父类的所有属性和方法,同时还可以定义自己的属性和方法
在这里插入图片描述

1.父类必须包含在子类当前文件中,且位于子类前面
2.定义子类时,必须在子类括号里指定父类的名称
3.super是一个特殊的函数,他使子类与父类连接起来,让其调用父类的__init__方法,让子类实例包含父类的所有属性

在python2.7中继承

class Car(object):def __init__(self,make,model,year):...class ElectricCar(Car):def __init__(self,make,model,year):super(ElectricCar,self).__init__(make,model,year)
  • 给子类定义属性和方法

Python日记(6)
对于子类car的特殊怀没有任何限制,如果一个属性、方法是任何car都有的,而不是子类车特有的,就应该将其放在父类里

  • 重写父类的方法

即在子类中定义一个要重写的父类中的方法,该重写的方法在子类中与父类中同名
在这里插入图片描述

  • 将实例用作属性

在这里插入图片描述

定义了一个名为Battery的新类,它没有继承任何类。Battery类__init__()除self外,还有另一个形参size。这个形参是可选的:如果没有给它提供值,size大小被设置为8。方法describe_size()也移到了这个类中。在ElectricCar类中,添加了一个名为self.battery的属性(。这行代码让Python 创建一个新的Battery实例(由于没有指定尺寸,因此为默认值70),并将该实例存储在属性 self.battery中。每当方法__init__()被调用时,都将执行该操作;因此现在每个ElectricCar实 例都包含一个自动创建的Battery实例。

  • 导入类

在这里插入图片描述

Python日记(6)

  • 从一个模块中导入多个类
from car import Car,Battery

导入的多种类之间用逗号隔开

  • 导入模块中的每个类
From car import *

不推荐使用这种导入方式,其原因有二。首先,如果只要看一下文件开头的import语句,就 能清楚地知道程序使用了哪些类,将大有裨益;但这种导入方式没有明确地指出你使用了模块中 的哪些类。这种导入方式还可能引发名称方面的困惑。如果你不小心导入了一个与程序文件中其 他东西同名的类,将引发难以诊断的错误。这里之所以介绍这种导入方式,是因为虽然不推荐使 用这种方式,但你可能会在别人编写的代码中见到它。 需要从一个模块中导入很多类时,好导入整个模块,并使用 module_name.class_name 语法 来访问类。这样做时,虽然文件开头并没有列出用到的所有类,但你清楚地知道在程序的哪些地 方使用了导入的模块;你还避免了导入模块中的每个类可能引发的名称冲突。

  • 在一个模块中导入另一个模块
    (自己运用,与上相似)

  • 自定义工作流程
    一开始应让代码结构尽可能简单。先尽可能在一个文件中完成所有的工作,确定一切都能正确运行后,再将类移到独立的模块中。如果你喜欢模块和文件的交互方式,可在项目开始时就尝 试将类存储到模块中。先找出让你能够编写出可行代码的方式,再尝试让代码更为组织有序。

Python标准库
Python标准库是一组模块,安装的Python都包含它。你现在对类的工作原理已有大致的了解, 可以开始使用其他程序员编写好的模块了。可使用标准库中的任何函数和类,为此只需在程序开头包含一条简单的import语句。下面来看模块collections中的一个类——OrderedDict。 字典让你能够将信息关联起来,但它们不记录你添加键—值对的顺序。要创建字典并记录其中的键—值对的添加顺序,可使用模块collections中的OrderedDict类。OrderedDict实例的行为几乎与字典相同,区别只在于记录了键—值对的添加顺序。
在这里插入图片描述

注意
Python Module of the Week:要了解 Python标准库,一个很不错的资源是网 站 Python Module of the Week。请访问 http://pymotw.com/并查看其中的目录,在其中找 一个你感兴趣的模块进行探索,或阅读模块 collections 和 random 的文档

类编码风格
1.类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。
2.实例名和模块名都采用小写格式,并在单词之间加上下划线。
3.对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要地描述类的功能,并遵循编写函数的文档字符串时采用的格式约定。
4.每个模块也都应包含一个文档字符串,对其中的类可用于做什么进行描述。
5.可使用空行来组织代码,但不要滥用。
6.在类中,可使用一个空行来分隔方法;
7.而在模块中,可使用两个空行来分隔类。需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句,再添加一个空行,然后编写导入你自己编写的模块的import语句。在包含多条import语句的程序中, 这种做法让人更容易明白程序使用的各个模块都来自何方。