python 定制类

__str__

class Student():

    def __init__(self):

        self.name = name

    def  __str__(self):

        return 'Student object name: %s' % self.name

    __repr__ = __str__

因为直接显示变量调用的不是__str__(),而是__repr__(),两者的区别是__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的。解决办法是再定义一个__repr__()。但是通常__str__()__repr__()代码都是一样的

__iter__

如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

class Fib(object):

    def __init__(self):

        self.a, self.b = 0,1#初始化a, b

    def __iter__(self):

         return self #实例本身就是迭代对象,返回自己

    def next(self):

         self.a, self.b = self.b, self.a + self.b #计算下一个值

         if self.a >100000:#退出循环的条件

               raise StopIteration():

          return self.a

>>> for n in Fib():
...     print n
...
1
1
2
3
5
...
46368
75025
__getitem__

class Fib():

    def__getitem__(self,n):

        a, b = 1,1

        for x in range(n):

            a, b = b, a+b

       return a

>>> f = Fib()
>>> f[0]
1
>>> f[1]
1
>>> f[2]
2
class Fib(onject):

    def __getitem__(self, n ):

         if isinstance(n, int):

             a, b = 0,1

             for x in range(n):

                  a,b = b, a+b

              return a

           if isinstance(n,slice):

               start = n.start

               stop = n.stop

               a,b = 1,1

               L = []

                for x in range(stop):

                     if x> = start:

                         L.append(a)

                      a,b = b,a+b

                 return L


__getattr__

class Student(object):

    def  __init__(self):

        self.name = 'dsadsa'

属性有name, 但是想要访问score属性是不能的,所以,需要出了加上score的属性,还可以写一个__getattr__方法,动态返回一个属性

class Student(object):

    def __init__(self):

        self.name = 'dsads'

    def __get__attr__(self,attr):

         if attr =='score'

             return 99

当调用不存在的score属性时,python解释器会试图调用__getattr__(self,attr)来尝试获得属性,就可以返回score的值

也可以返回函数

class Student(object):

    def __getattr__(self, attr):

         if attr =='age'

              return lambda:25

          raise AttribueError('\'Student\' object has no attribute \'%s\'' % attr)

__call__

一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?类似instance()?在Python中,答案是肯定的。任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用。

class Student(object):

    def __init__(self):

       self.name = name

    def __call__(self):

        print 'My name is %s. ' % self.name

#调用方式

s = Student('dsad')

s()

My name is dsad.

__call__还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。

如果你把对象看成函数,那么函数本身其实也可以在运行期动态创建出来,因为类的实例都是运行期创建出来的,这么一来,我们就模糊了对象和函数的界限。

那么,怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call()__的类实例:

callable(Student())

True

call(max)

True

callable([1,2,3])

False

callbale(None)

False

callable('string')

False

通过callable()函数,我们就可以判断一个对象是否是“可调用”对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值