python进阶-- 04 如何定制类

1.魔术方法--定义

定义在某一类中(如object中的__str__,list中的__len__等),不需要直接调用该方法,Python中的某些函数或操作符会调用对应的特殊方法(如print调用__str__,len()调用__len__等),任何该类的派生类可以通过重写这些特殊方法,来自定义这些方法的功能。

2.魔术方法--重写原则

只编写用到的特殊方法

有关联性的特殊方法都必须实现(如__getattr__、__setattr__、__delattr__)

3.魔术方法--属性相关

构造属性的get、set、del方法

方法一:

自己编写他的get、set、del方法,并提供给外部使用,通过指定的set、get方法来进行赋值、取值

class Student(object):

    def __init__(self, name, score):

        self.name = name

        self.__score = score

    def get_score(self):

        return self.__score

    def set_score(self, score):

        if score < 0 or score > 100:

            raise ValueError('invalid score')

        self.__score = score

方法二:

使用property、setter、getter方法或者装饰器,外部可直接使用属性名来赋值、取值,不必通过指定的set、get方法

4.特殊方法--举例

4.1类方法

__new__(cls, *args,**kw)

通常用于控制生成一个新实例的过程,它是类级别的方法。

 

4.2实例方法

__init__(self,*args,**kw)

控制初始化一个新实例的过程。自定义“实例=类名(*args,**kw)

__del__(self)

自定义“del 对象”方法

4.3打印相关

__str__(self)

自定义“print 实例” 或“str(实例)”方法

__repr__(s)

直接在交互行输入对象时使用

4.4s.attr方式访问

__getattr__(s, name)

自定义“实例.name”方法

__setattr__(s, name, val)

自定义“实例.name=val”方法

__delattr__(s, name)

自定义“del 实例.name”方法

4.5构造序列

__len__ (self)

自定义“len(实例)”方法

__getitem__ (self,key)

自定义“实例[key]”方法

__setitem__ (self,key,value)

自定义“实例[key]=value”方法

__delitem__(self,key)

自定义“del 实例[key]”方法

4.6构造迭代器

__iter__(self)

__next__(self)

自定义“for tmp in 实例”方法

http://www.maiziedu.com/wiki/python/special/

4.7构造可比较类

_lt_()

自定义“实例 < 实例”方法

_le_()

自定义“实例 <= 实例”方法

_gt_()

自定义“实例 > 实例”方法

_ge_()

自定义“实例 >= 实例”方法

_eq_()

自定义“实例 == 实例”方法

_ne_()

自定义“实例 != 实例”方法

__cmp__(self, other)

自定义“sorted([实例1,实例2,...])” 方法

4.8构造可运算类

_add_()

自定义“实例 + 实例”方法

_sub_()

自定义“实例 - 实例”方法

_mul_()

自定义“实例 * 实例”方法

_div_()

自定义“实例 / 实例”方法

http://www.maiziedu.com/wiki/python/special/

4.9转换类型

__int__

自定义“int(实例)”方法

__float__

自定义“float(实例)”方法

4.10其他

__slots__

目的是限制当前类所能拥有的属性(元组形式),如果不需要添加任意动态的属性,使用__slots__也能节省内存

class Student(object):

    __slots__ = ('name', 'gender', 'score')

    def __init__(self, name, gender, score):

        self.name = name

        self.gender = gender

        self.score = score

# 现在,对实例进行操作:

>>> s = Student('Bob', 'male', 59)

>>> s.name = 'Tim' # OK

>>> s.score = 99 # OK

>>> s.grade = 'A'

Traceback (most recent call last):

  ...

AttributeError: 'Student' object has no attribute 'grade'

__call__

自定义“实例(xx)”方法,类似于函数调用

class Fib(object):

    def __init__(self):

        pass

    def __call__(self,num):

        if num<0:

            raise ValueError('invalid score')

        L=[]

        L.append(0)

        if num==1:

            return L

        L.append(1)

        if num ==2:

            return L

        for i in range(3,num+1):

            L.append(L[-1]+L[-2])

        return L

f = Fib()

print f(10)

__hash__(s)

自定义“实例1 is 实例2”、“实例1 == 实例2”等方法

http://www.cnblogs.com/pengsixiong/p/5381850.html

__nonzero__(s)

将对象转为布尔值,自定义“if 实例:”方法

5.特殊语句

5.1exec语句

用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。

下面是一个简单的例子。

>>> exec 'print "Hello World"'

Hello World

5.2eval语句

用来计算存储在字符串中的有效Python表达式。下面是一个简单的例子。

>>> eval('2*3')

6

5.3assert语句

assert 语句用来声明某个条件是真的。例如,如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么 assert语句是应用在这种情形下的理想语句。当assert语句失败的时候,会引发一个AssertionError

>>> mylist = ['item']

>>> assert len(mylist) >= 1

>>> mylist.pop()

'item'

>>> assert len(mylist) >= 1

Traceback (most recent call last):

  File "", line 1, in ?

AssertionError

5.4raise语句

手动抛出异常

raise ValueError('invalid score')

6.附录

6.1python中属性详解

         可以实现设置只读属性(不设置set方法);在set、get、del属性同时进行自定义动作。

         http://python.jobbole.com/80955/

6.2__new__(cls,*args,**kw)与__init__(self,*args,**kw)的区别

         http://www.cnblogs.com/ifantastic/p/3175735.html

posted @ 2017-10-29 11:23  yc紫日  阅读(164)  评论(0编辑  收藏  举报