python 类_Python小白入门:第八讲||类

08ba9bcb7461e1b60ee0a12dfd7923c6.png

Python 是一种面向对象的编程语言。在面向对象编程中,你编写表示现实世界中的事务和情景的,并基于这些类来创建对象。
编写类时,你定义的一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。
根据类来创建对象被称为实例化,这让你能够使用类的实例。

在这一讲中,你将学习:

  • 如何编写类;
  • 如何使用属性在类中存储信息,以及如何编写方法,以让类具备所需的行为;
  • 如何编写方法__init__() ,以便根据类创建包含所需属性的 实例。
  • 如何修改实例的属性——包括直接修改以及通过方法进行修改。
  • 使用继承可简化相关类的创建工作;将一个类的实例用作另一个类的属性可让类更简洁。
  • 通过将类存储在模块中,并在需要使用这些类的文件中导入它们,可让项目组织有序。
  • Python标准库,并见识了一个使用模块collections 中 的OrderedDict 类的示例。
  • 编写类时应遵循的Python约定。

8.1创建和使用类

使用类可以模拟任何东西。

下面我们根据一个例子来更好的理解类:摘自《Python编程:从入门到实践》

8.1.2 创建Dog类

对于大多数狗,他们都有名字和年龄,它们还会蹲下和打滚。我们来创建一个Dog类包含他们。这个类让Python创建表示小狗的对象(实例)。

蹲下(sit())打滚(roll_over())

class Dog():    """一次模拟小狗的简单尝试"""    def _init_(self, name, age):        """初始化属性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")

第一行代码,定义了一个名为Dog的类。

记住在Python中,首字母大写的名称指的是类。

类中的函数称为方法,方法__init__()是一个特殊的方法,每当你根据Dog类来创建实例时,会自动运行它。

在这个方法名称中,开头和末尾各有两个下划线,这是为了避免Python默认方法与普通方法发生冲突。

方法__init__()包含三个形参:self, name,age。其中self必不可少,还必须位于其他形参前面。

为什么必须包含形参self呢?

因为Python调用方法__init__()来创建实例时,将自动传入实参self。

每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中属性和方法。

每次我们根据Dog类创建实例时,都只需给后面两个形参提供值,self会自动传递。

self.name = name和self.age = age都有前缀self。以self为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。

self.name = name获取存储在形参name中的值,并将其存储在变量name中,然后该变量被关联到当前创建的实例。self.age = age 与此类似。向这样可通过实例访问的变量称为属性。

方法sit()和roll_over()不需要额外的信息,因此只有一个形参self。当前这两个方法都只是简单的打印一条消息。

注意:在Python2.7中创建类时,在括号类包含单词object

class Dog(object):

8.1.2根据类创建实例

接下来我们创建一个表示小狗的实例

class Dog():    """一次模拟小狗的简单尝试"""    def _init_(self, name, age):        """初始化属性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('whilie', 6)print("My dog's name is " + my_dog.name.title() + ".")print("My dog is " + str(my_dog.age) + " years old.")

我们根据类创建了一个名为whillie 年龄位6的小狗实例。Python调用方法__init__(),并接受我们传递的实参,返回一个表示小狗的实例,并将其存储在变量my_dog中。

其中代码:my_dog.name 是句点表示法,以此来访问属性。

输出

My dog's name is Willie.My dog is 6 years old.

如何访问类中的其他方法呢 ?

和访问属性的方法类似——句点表示法

my_dog.sit()my_dog.roll_over()

输出

Willie is now sitting.Willie rolled over!

如果需要创建多个实例,多次调用类即可。

8.2 使用类和实例

类编写好后,就要学习如何使用类了。其中很重要的一个任务是学习如何修改实例的属性

8.2.1 给属性指定默认值

类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。如果你给属性指定了默认值,定义类是就无需包含为他提供初值的形参。

class Dog():    """一次模拟小狗的简单尝试"""    def _init_(self, name):        """初始化属性name和age"""        self.name = name        self.age = 6    def sit(self):        """模拟小狗被命令时蹲下"""        print(self.name.title() + " is now sitting.")    def roll_over(self):        """模拟小狗被命令时打滚"""        print(self.name.title() + " rolled over")

8.2.2 修改属性的值

直接修改——通过实例访问它,然后修改

my_dog.age = 10

通过方法修改——编写一个方法来修改属性

class Dog():    """一次模拟小狗的简单尝试"""    def _init_(self, name):        """初始化属性name和age"""        self.name = name        self.age = 6    def sit(self):        """模拟小狗被命令时蹲下"""        print(self.name.title() + " is now sitting.")    def roll_over(self):        """模拟小狗被命令时打滚"""        print(self.name.title() + " rolled over")    def update_age(self, num)        self.age = nummy_dog.update_age(10)

my_dog.update_age(10) 这里调用方法,并传递给形参num一个值,将num的值赋给属性age。

8.3 继承

编写类时,并非要从空白开始。

当你编写的类是另一个现成类的特殊版本,可使用继承

一个类继承另一个类时,他将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。

8.3.1 子类的方法__init__

创建子类的实例时,需要先给其父类的所有属性赋值。

class Dog():    """一次模拟小狗的简单尝试"""    def _init_(self, name, age):        """初始化属性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")class Dog_2(Dog):    """另一个特殊的Dog类"""    def __init__(self, name, age)    """初始化父类的属性"""    super().__init__(name, age)my_dog_2 = Dog_2('wodfg', 7)my_dog_2.sit()my_dog_2.roll_over()

定义子类时,必须在括号内指定父类的名称。

方法super()是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用父类的方法__init__(),让子类包含父类所有的属性。父类也称其为超类,名称super由此而来。

在Python2.7中继承语法稍有不同,函数super需要两个形参:子类名和对象self

class Dog_2(Dog):    """另一个特殊的Dog类"""    def __init__(self, name, age)    """初始化父类的属性"""    super(Dog_2, self).__init__(name, age)

我们创建好子类之后可以给子类定义属性和方法。

如果父类中的某个方法并不符合你的预期,你可对其进行重写:在子类中定义一个方法,方法名与父类的相同。这样Python只会使用子类中的方法。

如果发现自己的类代码太长,不便于阅读,可以将一部分作为一个独立的类提取出来。

8.4 导入类

当你不断给类添加功能,代码变长。为了让代码更简洁,你可以将类存储在模块中,然后再主程序中导入所需的模块。

我们将Dog类存储在一个名为dog.py的模块中

导入单个类

from dog import Dog

我们也可以在一个模块中存储多个类,需要哪个就导入哪个。

form dog import Dog, Dog_2

导入整个模块

import dog

导入模块中所有类

from module_name import *

不推荐使用这种导入方式,首先,这种方式没有明确指出你使用了模块中的那些类。

如果你不小心导入一个与程序文件中其他东西同名的类,将引发难以诊断的错误。

需要从一个模块中导入很多类时,最好导入整个模块,并使用module_name.calss_name语法来访问类。

这样做,虽然文件开头并没有列出用到的所有类,但你清楚的直到在程序的哪些地方使用了导入的模块,还避免了导入模块中的每个类可能引发的名称冲突。

在一个模块中导入另一个模块

有时候需要将类分散到多个模块中,以免模块太大,或者在同一个模块中存储不相关的类。

将类存储在不同模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类。

在这种情况下,可在前一个模块中导入必要的类。

8.5 Python标准库

Python标准库是一组模块,安装的Python都包含它

可使用标准库中任何函数和类,为此只需在程序开头包含一条简单的import语句。

下面来看模块collections中的一个类——OrderedDict。

字典让你能够将信息关联起来,但它们不记录你添加键-值对的顺序。

要创建字典并记录其中的键值对添加顺序,可使用模块collections中的OrderedDict类。

OrderedDict实例的行为几乎与字典相同,区别只在于记录键值对的添加顺序。

from collections import OrderedDictfavourite_languages = OrderedDict()favourite_languages['jen'] = 'Python'favourite_languages['sarah'] = 'c'favourite_languages['edward'] = 'ruby'favourite_languages['phil'] = 'pyython'for name, language in favourite_languages.items():    print(name.title() + "'s favourite language is " + language.title() + ".")

首先从模块collections中导入了OrderedDict类。
然后创建了一个实例,并将其存储到favourite_languages中。
这里并没有使用花括号,而是调用OrderedDict()来创建一个空的有序字典,并将其存储在favourite_languages中。
加下来我们以每次一对的方式添加(名字-语言)对。

8.6 类编码风格

你必须熟悉有些与类相关的编码风格问题,在你编写的程序较复杂时尤其如此。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值