首页 > 代码库 > python高级编程之描述符与属性03

python高级编程之描述符与属性03

# -*- coding: utf-8 -*-

# python:2.x

__author__ = ‘Administrator‘

#属性Property

#提供了一个内建描述符类型,它知道如何将一个特性链接到一组方法上,采用fget参数和3个可选的参数-fset,fdel,doc最后一个参数可以提供用来定义一个后链接到特性的docstring,就像个方法,如下

class MyClass(object):

    def __init__(self):

        self._my_seceret_ting=1

    def _i_get(self):

        return self._my_seceret_ting

    def _i_set_(self,a):

        self._my_seceret_ting=a

    def _i_delte(self):

        print ‘del‘

 

    my_ting=property(_i_get,_i_set_,_i_delte,‘the ting‘)

instance_of=MyClass()

print instance_of.my_ting#1

instance_of.my_ting=3

print instance_of.my_ting#3

del instance_of.my_ting#del

help(instance_of)

"""

属性简化了描述符编写,但是在使用类继承时必须小心处理,所创建的特性使用当前类方法创建,而不是使用在派生类中重载方法

如下:

"""

class A(object):

    def __get1(self):

        return ‘&aa‘

    price=property(__get1)

class S(A):

    def _get_price(self):

        return ‘bb‘

 

p=S()

print p.price#&aa

#解决方法是使用另一种方法手工将属性实例重定向到正确的方法,如下

class B(object):

    def _g(self):

        return ‘&qqw‘

    def _g1(self):

        return self._g()

    pr1=property(_g1)

class BB(B):

    def _get_price(self):

        return‘&bb‘

cc=BB()

print cc.pr1#&qqw

#尽管如此,大部分时候属性都添加到类中,以隐藏其性,链接到它们的方法是私有的,所有重载它们是不好的做法,在这样的情况下,重载属性本身会更好一些,如下

 

class B(object):

    def _g(self):

        return ‘&q1qw‘

    p1=property(_g)

class BB(B):

    def _a(self):

        return‘&bb1‘

 

aa=BB()

print aa.p1#&q1qw

 

print ‘&‘*300

#槽:__slots__特性为指定类设置一个静态特性列表,并且路过每个类实例中的__dict__列表创建工作,用来为特性很少的类节省存储空间,因为将不在每个实例中创建__dict__

#另一方便px还可以有助于设计签名被交结的类,例如

class Fr(object):

    __slots__=[‘ice‘,‘apply‘]

 

print ‘__dict__‘ in dir(Fr)#False

print ‘ice‘in dir(Fr)#True

g=Fr()

g.ice=1

g.apply=1

g.ic1e=1#AttributeError: ‘Fr‘ object has no attribute ‘ic1e‘

#注意:任何新的特性都将在__dict))中被添加,所以无法在派生类上工作

python高级编程之描述符与属性03