zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    一个不错的学习Hadoop和MapReduce的个人博客
    开源数据库sharding
    《控制论》导读 及 译者序 第二版序 读书笔记
    异常处理反模式
    主数据处理链碰到空数据节点不在继续执行的问题解决方案
    SAP 学习笔记 FI000 公司代码
    SAP概念之Client(集团),业务范围(business area),公司(company),公司代码(company code)
    零售行业主数据增量上载
    R/3数据源抽数到BWPSA中字段信息丢失
    BI CONTENT激活出现DUMP
  • 原文地址:https://www.cnblogs.com/yc913344706/p/7749623.html
Copyright © 2011-2022 走看看