上面讲到了序列和可变的数据,比如tuple,list,dict,并用基本类型对它们进行的抽象实现。这一届主要讲OOP。
5面对对象程序
一个对象是指,并且有方法和属性,通过点号访问。
5.1对象和类
类是对象的模板,对象是类的一个实例。
5.2定义类
类的声明如下:
class <name> (<base class>):
<suite>
name是类的名字,可以选择继承一个类,suite处是类的属性和方法。
类有自己的构造函数__init__()
,
class Account():
def __init__(self, account_holder):
self.balance = 0
self.holder = account_holder
构造函数两个参数,第一个参数self指向新创建的Account对象,代指自己。第二个参数是对象在实例化的时候进行使用。
实例化类:
>>> a = Account('Jim')
>>> a.holder
'Jim'
>>> a.balance
0
这种“调用“创造了类Account的一个实例a,同时用__init__()
构造函数对其进行了初始化。
特性:每一个类都有自己属性。
>>> b = Account('Jack')
>>> b.balance = 50
>>> [n.balance for n in (a,b)]
[0, 50]
方法:每一个方法都包含一个特殊的参数self,当函数被调用时,指向当前对象。
class Account():
def __init__(self, account_holder):
self.balance = 0
self.holder = account_holder
def deposit(self, amount):
self.balance = self.balance + amount
return self.balance
def withdraw(self, amount):
if amount > self.balance:
return 'Insufficient funds'
self.balance = self.balance - amount
return self.balance
5.3消息传递和点号表达式
在一个类中,不同nonlocal语句也可以实现函数之间的数据使用。,因为都是在一个类的环境中。
点号表达式:用点号表达式可以求出属性值,用python内置函数也可以求出同样的值,就像求字典值一样。
>>> getattr(b,'balance')
50
>>> hasattr(b,'deposit')
False
>>> hasattr(b,'balance')
True
getattr:查看相应的值。 hasattr:查看是否有相应的属性和方法。
方法和函数:如下,作为类的一个属性,方法就是函数。而作为实例的属性,只是一个方法。
>>> type(Account.deposit)
<class 'function'>
>>> type(tom.deposit)
<class 'method'>
有两种方式对方法deposit进行调用:
>>> Account.deposit(tom, 1001)
1101
>>> tom.deposit(1000)
2101
5.4类属性
>>> class People():
age = 20
>>> a = People()
>>> b = People()
>>> a.age
20
>>> b.age
20
>>> People.age = 15
>>> a.age
15
>>> b.age
15
>>> b.age = 10 #创建了一个新的实例属性,与存在属性同名,不受全局属性约束
>>> People.age = 5
>>> a.age
5
>>> b.age
10
5.5继承
代码重用,子类继承父类时,同时继承了属性和方法。当自乐调用子类不存在的属性或者方法时,向父类查找。
5.6多重继承
python中可以实现多重继承。
6实现类和对象
学习的一个重要过程就是用已存在的东西去解决未知的东西,前面已经实现过了tuple,list,dict。现在可以用字典和函数去实现类,达到了这样的一个功能。
6.1 实例
前面的dict是抽象数据类型,用list实现了dict,用pairs实现了list,用functions实现了pairs。