python class 的属性

来源:互联网 发布:科比各项数据荣誉 编辑:程序博客网 时间:2024/06/04 18:32

python class 的属性

Class 有一些特殊的属性,便于我们获得一些额外的信息。
>>> class Class1(object):    """Class1 Doc."""    def __init__(self):        self.i = 1234>>> Class1.__doc__ # 类型帮助信息'Class1 Doc.'>>> Class1.__name__ # 类型名称'Class1'>>> Class1.__module__ # 类型所在模块'__main__'>>> Class1.__bases__ # 类型所继承的基类(<type 'object'>,)>>> Class1.__dict__ # 类型字典,存储所有类型成员信息。<dictproxy object at 0x00D3AD70>>>> Class1().__class__ # 类型<class '__main__.Class1'>>>> Class1().__module__ # 实例类型所在模块'__main__'>>> Class1().__dict__ # 对象字典,存储所有实例成员信息。{'i': 1234}

成员

Python Class 同样包含类型和实例两种成员。

>>> class Class1:    i = 123 # Class Field    def __init__(self):        self.i = 12345 # Instance Field        >>> print Class1.i123>>> print Class1().i12345
两个比较重要的取实例属性的函数:

getattr(实例,属性名),hasattr(实例,属性名)判断属性名是否属于实例。

如上例:s='i',getattr(Class1(),s)=12345

hasattr(Class1(),s)=True
-----------------------

有几个很 "特殊" 的 "规则" 需要注意。

(1) 我们可以通过实例引用访问类型成员。因此下面的例子中 self.i 实际指向 Class1.i,直到我们为实例新增了一个成员 i。

>>> class Class1:    i = 123    def __init__(self):        print self.i         print hex(id(self.i))>>> hex(id(Class1.i)) # 显示 Class1.i'0xab57a0'>>> a = Class1() # 创建 Class1 实例,我们会发现 self.i 实际指向 Class1.i。1230xab57a0>>> Class1.__dict__ # 显示 Class1 成员{'i': 123, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x00D39470>}>>> a.__dict__ # 显示实例成员{}>>> a.i = 123456789 # 为实例新增一个成员 i>>> hex(id(a.i)) # 显示新增实例成员地址'0xbbb674'>>> a.__dict__ # 显示实例成员{'i': 123456789}

我们可以在成员名称前添加 "__" 使其成为私有成员。

>>> class Class1:    __i = 123    def __init__(self):        self.__x = 0    def __test(self):        print id(self)事实上这只是一种规则,并不是编译器上的限制。我们依然可以用特殊的语法来访问私有成员。
>>> Class1._Class1__i123>>> a = Class1()>>> a._Class1__x0>>> a._Class1__test()13860376-----------------------除了静态(类型)字段,我们还可以定义静态方法。
>>> class Class1:    @staticmethod    def test():        print "static method">>> Class1.test()static method

重载
Python 支持一些特殊方法和运算符重载。

>>> class Class1:    def __init__(self):        self.i = 0    def __str__(self):        return "id=%i" % id(self)    def __add__(self, other):        return self.i + other.i>>> a = Class1()>>> a.i = 10>>> str(a)'id=13876120'>>> b = Class1()>>> b.i = 20>>> a + b30通过重载 "__eq__",我们可以改变 "==" 运算符的行为。
>>> class Class1:    pass>>> a = Class1()>>> b = Class1()>>> a == bFalse>>> class Class1:    def __eq__(self, x):        return 55>>> a = Class1()>>> b = Class1()>>> a == b55
原创粉丝点击