第七章 再谈抽象
自定义`类和对象
7.1 对象魔法
多态:可对不同类型的对象执行相同的操作,而这些操作就像“被施了魔法”一样能够正常运行。
封装:对外部隐藏有关对象工作原理的细节。
继承:可基于通用类创建出专用类。
7.1.1 多态
大致意味着即便你不知道变量指向的是哪种对象,也能够对其执行操作,且操作的行为将随对象所属的类型(类)而异。
7.1.2 多态和方法
与对象属性相关联的函数称为方法。
标准库模块random包含一个名为choice的函数,它从序列中随机选择一个元素。下面使用这个函数给变量提供一个值。
'''
from random import choice
x = choice(['Hello, world!', [1, 2, 'e', 'e', 4],"张三"])
print(x)
'''
执行这些代码后,x可能包含字符串'Hello, world!',也可能包含列表[1, 2, 'e', 'e', 4]。具体是哪一个,你不知道也不关心。你只关心x包含多少个'e',而不管x是字符串还是列表你都能找到答案。者就是方法的多态。
张三
------------------
(program exited with code: 0)
请按任意键继续. . .
7.1.3 封装
指的是向外部隐藏不必要的细节。这听起来有点像多态(无需知道对象的内部细节就可使用它)。这两个概念很像,因为它们都是抽象的原则。它们都像函数一样,可帮助你处理程序的组成部分,让你无需关心不必要的细节。
7.1.4 继承
继承是类的继承,以基类为基础而创建新类或者是专用类。
7.2 类
7.2.1 类是什么
类是对象模型,对象是建立在类的基础上的。张三是人类,黑子是犬类,人和犬是动物类。其中张三和黑子是对象,它是人类和犬类的具体化,而人类和犬类是继承了动物类特性的子类。
7.2.2 创建自定义类
和大部分编程语言一样创建类用关键字class。比如建一个person(人)类,人有姓名,人会说“你好”。
'''
class Person:
name=""
def set_name(self,name):
self.name=name
def get_name(self):
return self.name
def greet(self):
print("{}你好!".format(self.name))
'''
这个类中有一个属性三个方法,分别是设置姓名、获取姓名和输出你好!谁谁;但它只是个模板不是个具体的person(人),还不能直接运行,还必须让它具体到“具体的人”,才可以在程序中起作用,那就是用这个模板创造个对象。
'''
foo=Person()
bar=Person() #创建了foo和bar两个对象。
foo.set_name("张三")
bar.set_name("李四") #为这两个对象的name属性赋值(起名字)
foo.greet()
bar.greet() #两个对象个输出一段话
'''
张三你好!
李四你好!
------------------
(program exited with code: 0)
请按任意键继续. . .
self是什么。对foo调用set_name和greet时,foo都会作为第一个参数自动传递给它们。我将这个参数命名为self,这非常贴切。实际上,可以随便给这个参数命名,但鉴于它总是指向对象本身,因此习惯上将其命名为self。显然,self很有用,甚至必不可少。如果没有它,所有的方法都无法访问对象本身——要操作的属性所属的对象。
'''
'''
class Person:
名=""
def set_名(这个,名):
这个.名=名
def get_名(这个):
return 这个.名
def greet(这个):