python类内部 "__*__" 方法的作用

#本文是慕课网《Python项目实战-核心技术进阶训练篇》的学习笔记

 

 

__new__()

本身是一个类方法,先于__init__()执行,返回一个实例,可以改变实例化行为

 

class MyClass(tuple):
    def __new__(cls, *args):
        a = [x for x in args]
        return super(MyClass, cls).__new__(cls, a)

    def __init__(self, *args):
        print self  #>> (1, 2,3)
        super(MyClass, self).__init__(*args)


m = MyClass(1, 2, 3)
print m  #>> (1, 2,3)

 

 

 

 

__dict__

实例属性,用于动态绑定实例属性

 

class MyClass(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b


m = MyClass(1, 2)
print m.__dict__ #{'a': 1, 'b': 2}

m.c = 3
print m.__dict__  #{'a': 1, 'b': 2, 'c': 3}

m.__dict__["d"] = 4
print m.d  # 4

 

 

__slots__

类属型,用于解决动态属性绑定占用内存的问题,需提前声明类属性且不可变更

 

class MyClass1(object):
    __slots__ = ['a', 'b']

    def __init__(self, a, b):
        self.a = a
        self.b = b

m1 = MyClass1(1, 2)
print m1.a, m1.b #1 2

m1.c = 3 #raise AttributeError

 

 

 

 

 

__enter__() and __exit__()

实例方法,用于使实例支持上下文管理(with as).

前者在开始时调用必须返回实例对象self,

后者在结束或者产生错误时调用,__exit__()的参数中exc_type, exc_value, traceback用于描述异常

 

class MyClass(object):
    def __enter__(self):
        self.f = open('test.txt', 'w')
        return self

    def pname(self):
        print self.f.name

    def for_read(self):
        raise AttributeError("f could only wirte")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print "in exit()"
        self.f.close()


with MyClass() as m:
    m.pname() 
"""
test.txt
in eixt()
"""
with MyClass() as n:
    n.for_read()
"""
in eixt()
AttributeError:f could only write
"""
 

 

 

 

 

property()

内置工厂函数,用于类内部设置可管理属性

 

property(fget, fset, fdel)

 

 

 


__lt__()  __le__()  __gt__()  __ge__()  __eq__()  __ne__()

     <                           <=                   >                      >=                             =                     !=

可以实现类之间的大小比较

另有functools.total_ordering可以只定义等于和大于(或小于)就可以比较全部符号

from functools import total_ordering

 

from functools import total_ordering

@total_ordering
class Rect(object):
    def __init__(self, length, width):
        self.lenght = length
        self.width = width

    def area(self):
        return self.lenght * self.width

    def __lt__(self, obj):
        return self.area() < obj.area()

    def __eq__(self, obj):
        return self.area() == obj.area()


r1 = Rect(1, 2)
r2 = Rect(1, 4)

print r1 > r2 #False

 

__del__()

 

实例方法,用于在python垃圾回收机制回收变量时执行

 

class MyClass(object):
    def __del__(self):
        print 'in __del__'

c = MyClass()
c = 4 #in __del__

 

 

 

 

 

新开公众号“码家村”,欢迎关注

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值