目录
1 Object的创建
▲一个对象Object是由函数(我们称之为方法method)以及这些函数所使用的数据所组成的,我们称数据为对象属性attributes的一部分。如list为python的一个内置对象:
stuff = list()
stuff.append('python')
stuff.append('chuck')
stuff.sort()
dir(stuff)
▲append,sort为list对象的方法,采用dir()函数查看对象中包含的内容
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
▲采用class定义一个对象
▲正如def关键字不会导致函数代码被执行一样,class关键字也不会创建对象。相反,class关键字定义了一个模板,指示PartyAnimal类型的每个对象将包含哪些数据和代码
###define an object####
class PartyAnimal:
x = 0 ###x为attributes
def party(self) :
self.x = self.x + 1
print("So far",self.x) ###party为method
#####main code####
an = PartyAnimal()###创建一个PartyAnimal对象赋给an
an.party()
an.party()
an.party() ###调用三次party方法
PartyAnimal.party(an) ###另一种方式调用party方法
输出内容:
So far 1
So far 2
So far 3
So far 4
▲ type和dir函数分别用来查看对象的类型和内容
###define an onject###
class PartyAnimal:
x = 0
def party(self) :
self.x = self.x + 1
print("So far",self.x)
###main code###
an = PartyAnimal()###创建一个PartyAnimal对象
print ("Type", type(an))###an类型为<class '__main__.PartyAnimal'>
print ("Dir ", dir(an))###an的内容,包括x(attribute)和定义的方法party
print ("Type", type(an.x))###x的类型为<class 'int'>
print ("Type", type(an.party))###party的类型为<class 'method'>
输出内容:
Type <class '__main__.PartyAnimal'>
Dir ['__class__', '__delattr__', ...
'__sizeof__', '__str__', '__subclasshook__',
'__weakref__', 'party', 'x']
Type <class 'int'>
Type <class 'method'>
2 对象的构造函数和析构函数
▲构造函数(constructor) ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值
▲析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数
class PartyAnimal:
x = 0###attribute
def __init__(self):
print('I am constructed')###构造函数
def party(self) :
self.x = self.x + 1
print('So far',self.x)###party函数
def __del__(self):
print('I am destructed', self.x)###析构函数
an = PartyAnimal()###创建对象时自动调用构造函数
an.party()
an.party()
an = 42###自动调用析构函数
print('an contains',an)
输出内容:
I am constructed
So far 1
So far 2
I am destructed 2
an contains 42
▲在构造函数中赋值
class PartyAnimal:
x = 0
name = ''
def __init__(self, nam):
self.name = nam
print(self.name,'constructed')
def party(self) :
self.x = self.x + 1
print(self.name,'party count',self.x)
s = PartyAnimal('Sally')###‘Sally’赋给s的name属性
j = PartyAnimal('Jim')###‘Jim’赋给j的name属性
s.party()
j.party()
s.party()
输出内容:
Sally constructed
Jim constructed
Sally party count 1
Jim party count 1
Sally party count 2
3 类的继承
▲child class子类继承parent class父类的内容
from party import PartyAnimal
class CricketFan(PartyAnimal):###CricketFan子类继承PartyAnimal父类
points = 0###子类的新属性
def six(self):###子类的新方法
self.points = self.points + 6
self.party()###调用父类的方法
print(self.name,"points",self.points)
s = PartyAnimal("Sally")
s.party()
j = CricketFan("Jim")
j.party()
j.six()
print(dir(j))
输出内容:
Sally constructed
Sally party count 1
Jim constructed
Jim party count 1
Jim party count 2
Jim points 6
['__class__', '__delattr__', ... '__weakref__',
'name', 'party', 'points', 'six', 'x']
4 迭代器
▲在 Python 中,迭代器是实现迭代器协议的对象,它包含方法 __iter__() 和 __next__()
▲iter()返回一个迭代器,next()指向迭代器中的下一个元素,如:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)###创建迭代器myit
print(next(myit))
print(next(myit))
print(next(myit))###持续输入迭代器中的元素
▲可以用for loop来遍历可迭代的变量
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
▲创建迭代器
要把对象/类创建为迭代器,必须为对象实现 __iter__() 和 __next__() 方法
#创建一个返回数字的迭代器,从 1 开始,每个序列将增加 1(返回 1、2、3、4、5 等):
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
▲停止迭代 StopIteration
###在20个迭代后停止
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration###停止迭代
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)