zoukankan      html  css  js  c++  java
  • python class 的属性

    http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035690.html

    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.i
    123
    >>> print Class1().i
    12345
    两个比较重要的取实例属性的函数:

    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。
    123
    0xab57a0
    >>> 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__i
    123
    >>> a = Class1()
    >>> a._Class1__x
    0
    >>> 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 + b
    30
    通过重载 "__eq__",我们可以改变 "==" 运算符的行为。
    >>> class Class1:
        pass
    
    >>> a = Class1()
    >>> b = Class1()
    >>> a == b
    False
    
    >>> class Class1:
        def __eq__(self, x):
            return 55
    >>> a = Class1()
    >>> b = Class1()
    >>> a == b
    55
     
  • 相关阅读:
    ConcurrentHashMap的初步使用场景、源码分析讲解(中)
    ConcurrentHashMap的初步使用场景、源码分析讲解(上)
    CyclicBarrier用例、源码分析讲解
    Semaphore用例、源码分析讲解
    CountDownLatch用例、源码分析讲解
    Condition用例、源码分析详解(下)
    Condition用例、源码分析详解(上)
    图解数据结构之数组、链表、栈、队列
    Python--day27--复习
    Python--day26--反射
  • 原文地址:https://www.cnblogs.com/lvxiuquan/p/2683225.html
Copyright © 2011-2022 走看看