#python学习笔记(二十)#面向对象编程:类和继承

目录

1 Object的创建

2  对象的构造函数和析构函数

3 类的继承

4 迭代器


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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值