7.1对象
7.1.1
多态:对不同类型的对象执行相同的操作。
isinstance 函数:检查对象是否为元组。
def get_price(object):
if isinstance(object,tuple):
return object [1]
else:
return magic_network_method(object)
7.1.2
方法: 与对象属性相关联的函数称为方法
例如:
‘abc’.count(‘a’)
1
choice 函数(包含在模块random中)
from random import choice
x=choice(‘Hello,word!’,[1,2,‘e’,‘e’,3])
此时的x可能包含字符串,也可能包含列表。
多态在默默的起作用的例子。
执行函数add(x,y)
return x+y
这里的x和y可以任意的可以执行相加操作的对象。
函数repr
def length_method(x):
print (‘The length of’,repr(x),‘is’,len(x))
length_method(‘Ford’)
The length of Ford is 5
7.1.3
封装:向外部隐藏不必要的细节。
与多态的区别在于:多态无需知道对象的类型,而封装无需知道对象的构造。
7.1.4
继承:如创建了一个类,里面包含另一个类,当你启动这个类的时候,另一个类也会自动启动。
7.2类
7.2.1
类的含义:每个对象都属于一个类,这个对象是类的实例。
例如鸟是一个类,云雀是鸟的子类,鸟是云雀的超类。
在Python中约定类的首字母大写,且是单数。如:Bird
类的所有实例都有该类的方法,所以子类的所有实例都有超类的方法。因此要定义子类只需定义多出来的方法(这段话的内容我也不是很懂,可能是由于我还不大懂方法到底是个什么东西)
7.2.2
创建自定义类:
class语句创建了独立的命名空间,用于在其中定义函数,Hon是类的名称。其中定义的函数即为这个类的方法。
参数self:指向对象本身,是方法必不可少的东西如下当f调用set_name时f会作为第一个参数传给它们,此参数就命名为self
7.2.3
函数和方法的一个区别在于方法将其的第一个参数关联到实例,因此无需提供此参数,如上图第三四行,而普通的函数就没有特殊参数self了。
7.2.4
1.在默认情况下,可从外部访问对象的属性,但有的程序员认为这违反了封装原则,即应该对外部完全隐藏对象的状态。
2.私有属性:即不能从对象外部访问,只能通过存取器方法访问。
3.建立私有属性的方法:在名称前加两个下划线。当不希望名称被修改,但又想发出不要从外部修改的属性或方法的信号,可在名称前加一个下划线,还有一个作用是用 from …import…时不会导入一个下划线打头的名称。
7.2.5
类的命名空间:在一个类内的代码都是在类的命名空间内执行的,类的所有成员都可以访问这个空间。
在类定义中并非只有 def 语句
例如:
class C:
print(“you are …”)
a是类的作用域内定义的全局变量,所有成员都可以访问。
当在一个实例内给a 赋值后,这个新值就把原来的值覆盖了。
7.2.6
子类扩展了超类,要在子类中指定超类,可在class语句中的类名后用圆括号将超类名括起来。
7.2.7
1.确定一个类是不是另一个类的子类,用内置方法issubclass
2.用__base__来访问类的基类
3.用isinstance来确定对象是否是类的实例
4.获悉对象属于哪个类,用__class__
7.2.8
多重继承:
class Ade:
def cal(self):
…
def xyz(self):
…
class Bde:
def …
…
def …
…
class Cde(Ade,Bde):
…
多重继承应避免使用,当时用多重继承时,若有多个同名方法时应在class语句中小心排列避免位于前面的类的方法覆盖后面的类的方法。当多个超类的超类相同时,查找特定方法或者属性时访问超类的顺序称为方法解析顺序(MRO)。
7.2.9
接口:处理多态对象时, 对外暴露的方法和属性。
检查所需的方法是否存在:示例
hasattr(tc,‘talk’)
True
hasattr(tc,‘fnord’)
False
检查talk是否可以调用方法示例:
callable(getattr(tc,‘talk’,None’))
True
getattr 能够指定属性不存在时使用的默认值为None,对返回的对象调用时用callable
查看对象中储存的所有值用 __dict__检查属性,确定对象由什么组成,应研究模块inspect。
7.2.10
抽象类: 是不能实例化的类,其定义子类应该实现的一组抽象方法。