`
onlynima
  • 浏览: 5243 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

从零开始学Python

 
阅读更多

第七章:魔法方法、构造器等

1.魔法方法:

  构造方法:

   当一个对象被创建的时候自动调用的方法

   class Foo:

   def __init__(self):

     self.value=10

   >>f=Foo()

   >>f.value

   输出:10

  重写一般的方法和特殊的构造方法

   首先要有继承关系

  class A:

    def pri(self):

      print(hello A)

  class B(A):#继承A

def pri(self):

  print(hello B!)

  >>b=B()

  >>b.pri()

  输出:hello B!

另外两种继承的方法:

1.super(子类名,self).__init__(超类的构造方法的参数只能在新式类中使用

2.超类.__init__(超类的构造方法的参数不限

实例:

class Bird(object):

def __init__(self):

self.h=True

def eat(self):

if self.h:

print('eatting... ')

self.h=False

else:

print('do not hungry')

class Song(Bird):

def __init__(self):

super(Song,self).__init__()#Bird.__init__(self)调用超类的构造方法旧版Python

self.sound='singing'

def sing(self):

print(self.sound)

sb=Song()

sb.sing()

sb.eat()

sb.eat()

input("<enter> for exit")

2.成员访问的一些方法

   __len(self)__返回集合中所有项目的数量,对于序列来说就是元素的个数,映射是键值对的个数

   __getitem(self,key)__获取所对应key的键值,序列是0~n-1的整数,映射则是任何种类的键

   __setitem(self,key,value)__设置所对应key的键值,序列是0~n-1的整数,映射则是任何种类的键

   __delitem(self,key)__删除所对应key的键值,序列是0~n-1的整数,映射则是任何种类的键

以上方法都是对于self对象使用的,因此在使用的时候可能会抛出一些异常。

3.子类化列表、字符串和字典

  继承内建类型(list,UserList,UserString,UserDict)然后重写构造方法

4.关于属性

  在新类中

  class Rec:

  def __init__(self):

      self.width=0

      self.height=0

def setSize(self,size):

  self.width,self.height=size

def getSize(self):

  return self.width,self.height

size=property(getSize,setSize)

>>r=Rec()

>>r.width=10

>>r.height=5

>>r,size

输出:(10,5)

>>r.size=100,100

输出r.width=100,r.height=100

在上例中用property()函数将取值和赋值的方法包装(按照顺序)定义为size属性,size属性包含取值和计算。

property()可以有0,1,2,3,4个参数,0个参数表示产生的属性不能读也不能写 property(fget=None,fset=None,fdel=None,doc=None)    

前面3个参数都是未绑定的方法,所以它们事实上可以是任意的类成员函数 

property()函数前面三个参数分别对应于数据描述符的中的__get____set____del__方法,所以它们之间会有一个内部的与数据描述符的映射。最后一个表示文档字符串。

5.静态方法和类成员

  class Rec:

    @staticmethod

def setSize():

  print()

@classmethod

def getSize(self):

  pass

静态方法无绑定,和普通函数使用方法一样,只是需要通过类或者实例来调用。没有隐性参数。

 

类方法通过隐性参数绑定在类上,函数内可通过隐性参数进行实例生成。

一些其他重要方法:

__getattribute__(self,name):当特性被访问时自动调用(只能在新式类中)

__getattr__(self,name):当特性name被访问且对象没有相应的特性时自动调用

__setattr__(self,name,value):当试图给name赋值时自动调用

__delattr__(self,name)__当试图删除特性name时调用

6.迭代器

class Fibs:

def __init__(self):

self.a=0

self.b=1

def __next__(self):

self.a=self.b

self.b=self.a+self.b

return self.a

def __iter__(self):

return self

迭代器就是_iter__()方法,返回对象本身,可以参与到for循环中。一个实现了__iter__()方法的对象是可以迭代的,实现了__next()__()方法才是迭代器

另外内建函数iter()也可以获得迭代器

it=iter([1,2,3])

>>it.next()

输出1

>>it.next()

输出2

迭代器方法,只要对象创建了,迭代器就产生了,这点要注意,和构造方法类似,另外迭代器既然可以迭代,那就能生成列表,用list()方法.

7.生成器

任何包含yield的语句都是生成器

      nes=[[1,2][3,4],[5]]

      def fla(nes):

    for i in nes:

      for j in i:

        yield j

>>for num in fla(nes)

输出num:1 2 3 4 5 

return不同的是,yield每次产生多个值,如果产生一个值,函数就会被冻结,等待激活,才能继续执行。

生成器推导式,和列表推导式类似,不过返回的不是列表,而是生成器(并且不会立刻循环),可以一步步计算。

  >>g=((i+2)**2 for i in range(2,27))

8.递归生成器

    nes=[[1,2][3,4],[5]]

      def fla(nes):

       try:

    for i in nes:

      for j in nes[i]:

        yield j

   Except TypeError:

    yield nes    

>>for num in fla(nes)

输出num:1 2 3 4 5 

但是要判断字符串,就不在此赘述。

9.生成器方法

   外部作用域访问生成器:send() 方法,需要参数,访问next(),只有在内部生成器挂起之后才能执行,也就是yield第一次执行之后,参数为None的时候,启动生成器

   throw方法,在yield表达式中,引发一个异常。

   close方法,停止生成器

模拟生成器:

      def fla(nes):

       res=[]

       try:

        try:nes+’’

        except TypeError:pass

        else:raise TypeError

    for i in nes:

      for j in nes[i]:

        res.append(j)

   Except TypeError:

    res.append(j)    

   return res

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics