码迷,mamicode.com
首页 > 其他好文 > 详细

chapter 13面向对象-再次阅读

时间:2015-03-12 11:45:19      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

1.复习一下dir()和__dict__.

>>> class C(object):

pass


>>> c=C()

>>> dir(C)

[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘, 


‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]

>>> dir(c)

[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘, 


‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]

>>> c.__dict__

{}

>>> c.bar=‘rao‘

>>> dir(c)

[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘, 


‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘, 


‘bar‘]

>>> dir(C)

[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘, 


‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]

>>> c.__dict__

{‘bar‘: ‘rao‘}


可以看出实例的dir(c)包括类的dir(C)加上实例自己的数据属性。

而实例的__dict__则仅仅是他的数据属性,(实例也没有方法属性)

内建类型中可以用dir(),不可以用__dict__

2.

实例仅有两个特殊属性(见表13.2)。对于任意对象I:

表13.2 特殊实例属性

I.__class__ 实例化I 的类

I.__dict__ I 的属性





从标准类型派生(标准类型分两种:可变类型,不可变类型)

可变类型(list的值改变了但是id没有变化,id(list)一直不变化):list,dict

不可变类型:string,int,tuple


class RoundFloat(float):

def __new__(cls, val):


return float.__new__(cls, round(val, 2))

#return super(RoundFloat,cls).__new__(cls,round(val,2))


tips:所有的__new()__方法都是类方法,我们要显式传入类作为第一个参数(cls),这类似于常见的方法如__init__()中需要的self


类、实例和其他对象的内建函数:

issubclass(sub,sup)

isinstance(obj1,obj2)

hasattr(), getattr(),setattr(), delattr()有两个参数,第一个是正在处理的对象,第二个就是属性名,是属性的字符串名字


对于每个定义的类都有一个名为__mro__的属性,她是一个元组,按照他们被搜索时的顺序,列出了被搜索的类。super()是用来解决多重继承的问


题的,而且只能作用于新式类上。super()用来调用父类非绑定的方法


vars()

vars()内建函数与dir()相似,只是给定的对象参数都必须有一个__dict__属性。vars()返回一

个字典,它包含了对象存储于其__dict__中的属性(键)及值。如果提供的对象没有这样一个属性,

则会引发一个TypeError 异常。如果没有提供对象作为vars()的一个参数,它将显示一个包含本地

名字空间的属性(键)及其值的字典,也就是,locals()。我们来看一下例子,使用类实例调用vars():




用特殊方法定制类:


class Time60(object):

    def __init__(self,hr,min):

        self.hr=hr

        self.min=min


    def __str__(self):

        return ‘%d:%d‘%(self.hr,self.min)


    __repr__=__str__


    def __add__(self,other):

        hour=self.hr+other.hr

        mins=self.min+other.min

        if mins>60:

            return self.__class__(hour+1,mins-60)

        else:

            return self.__class__(hour,mins)


    def __sub__(self,other):

        return self.__class__(abs(self.hr-other.hr),abs(self.min-other.min))


mon=Time60(10,30)

tue=Time60(11,55)

print mon-tue


随机序列迭代器:

要想自定义的类的实例可以迭代必须加载iter方法

    def __iter__(self):

        return self


from random import choice


class RandSeq(object):

    def __init__(self,seq):

        self.data=seq

    def __iter__(self):

        return self


    def next(self):

        return choice(self.data)


    def __str__(self):

        return  str(self.data)


rand=RandSeq([1,2,3,4,5])


for eachItem in rand:

    print eachItem




class AnyIter(object):

    def __init__(self,data,safe=False):

        self.safe=safe

        self.iter=iter(data)


    def __iter__(self):

        return self


    def next(self,howmany):

        retval=[]

        for eachItem in range(howmany):

            try:

                retval.append(self.iter.next())

            except StopIteration:

                if self.safe:

                    break

                else:

                    raise

        return retval

a=AnyIter(range(10))

i=iter(a)

for j in range(1,5):

    print j,‘:‘,a.next(j)


question:这个例子中我不明白为什么要设置i=iter(a),然后调用print j,‘:‘,i.next(j),我发现直接调用我写的 print j,‘:‘,a.next(j)

也是生成同样的结果哎。。。


*多类型定制(NumStr)


class NumStr(object):

    def __init__(self,num=0,str=‘‘):

        self.num=num

        self.str=str

    def __str__(self):

        return "[%d::%r]"%(self.num,self.str)

    __repr__ = __str__


    def __add__(self,other):

        return self.__class__(self.num+other.num,self.str+other.str)

    def __mul__(self,num):

        if isinstance(num,int):

            return self.__class__(self.num*num,self.str*num)

        else:

            raise TypeError,‘Illegal argument type for built-in operation‘


    def __nonzero__(self):

       return self.num or len(self.str)

    def __norm_cval(self,cmpres):

        return cmp(cmpres,0)

    def __cmp__(self,other):

        return self.__norm_cval(cmp(self.num,other.num))+self.__norm_cval(cmp(self.str,other.str))


a=NumStr(2,‘rao‘)

b=NumStr(3,‘yuan‘)

print a>b



包装的定义:



chapter 13面向对象-再次阅读

标签:

原文地址:http://my.oschina.net/yusi/blog/386059

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!