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

    Class 有一些特殊的属性,便于我们获得一些额外的信息。

     1 >>> class Class1(object):
     2     """Class1 Doc."""
     3     def __init__(self):
     4         self.i = 1234
     5 
     6 >>> Class1.__doc__ # 类型帮助信息
     7 'Class1 Doc.'
     8 >>> Class1.__name__ # 类型名称
     9 'Class1'
    10 >>> Class1.__module__ # 类型所在模块
    11 '__main__'
    12 >>> Class1.__bases__ # 类型所继承的基类
    13 (<type 'object'>,)
    14 >>> Class1.__dict__ # 类型字典,存储所有类型成员信息。
    15 <dictproxy object at 0x00D3AD70>
    16 >>> Class1().__class__ # 类型
    17 <class '__main__.Class1'>
    18 >>> Class1().__module__ # 实例类型所在模块
    19 '__main__'
    20 >>> Class1().__dict__ # 对象字典,存储所有实例成员信息。
    21 {'i': 1234}

    成员

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

    1 >>> class Class1:
    2     i = 123 # Class Field
    3     def __init__(self):
    4         self.i = 12345 # Instance Field
    5         
    6 >>> print Class1.i
    7 123
    8 >>> print Class1().i
    9 12345
    两个比较重要的取实例属性的函数:

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

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

    hasattr(Class1(),s)=True


    -----------------------

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

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

     1 >>> class Class1:
     2     i = 123
     3     def __init__(self):
     4         print self.i 
     5         print hex(id(self.i))
     6 
     7 >>> hex(id(Class1.i)) # 显示 Class1.i
     8 '0xab57a0'
     9 >>> a = Class1() # 创建 Class1 实例,我们会发现 self.i 实际指向 Class1.i。
    10 123
    11 0xab57a0
    12 >>> Class1.__dict__ # 显示 Class1 成员
    13 {'i': 123, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x00D39470>}
    14 >>> a.__dict__ # 显示实例成员
    15 {}
    16 >>> a.i = 123456789 # 为实例新增一个成员 i
    17 >>> hex(id(a.i)) # 显示新增实例成员地址
    18 '0xbbb674'
    19 >>> a.__dict__ # 显示实例成员
    20 {'i': 123456789}

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

    1 >>> class Class1:
    2     __i = 123
    3     def __init__(self):
    4         self.__x = 0
    5     def __test(self):
    6         print id(self)


    事实上这只是一种规则,并不是编译器上的限制。我们依然可以用特殊的语法来访问私有成员。
    1 >>> Class1._Class1__i
    2 123
    3 >>> a = Class1()
    4 >>> a._Class1__x
    5 0
    6 >>> a._Class1__test()
    7 13860376

    -----------------------

    除了静态(类型)字段,我们还可以定义静态方法。
    1 >>> class Class1:
    2     @staticmethod
    3     def test():
    4         print "static method"
    5 >>> Class1.test()
    6 static method

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

     1 >>> class Class1:
     2     def __init__(self):
     3         self.i = 0
     4     def __str__(self):
     5         return "id=%i" % id(self)
     6     def __add__(self, other):
     7         return self.i + other.i
     8 
     9 >>> a = Class1()
    10 >>> a.i = 10
    11 >>> str(a)
    12 'id=13876120'
    13 >>> b = Class1()
    14 >>> b.i = 20
    15 >>> a + b
    16 30

    通过重载 "__eq__",我们可以改变 "==" 运算符的行为。
     1 >>> class Class1:
     2     pass
     3 
     4 >>> a = Class1()
     5 >>> b = Class1()
     6 >>> a == b
     7 False
     8 
     9 >>> class Class1:
    10     def __eq__(self, x):
    11         return 55
    12 >>> a = Class1()
    13 >>> b = Class1()
    14 >>> a == b
    15 55

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

  • 相关阅读:
    阿里云esc 安装 mysql8.0
    阿里云esc 登录时的相关提示
    C# web项目 log4net 使用
    MVC 全局异常捕获
    datetimepicker 基础使用/select2 基础使用
    C# 从登陆开始 MVC4+BOOTSTRAP
    Android如何导入语言资源
    Android自带邮件含中文的附件用HTML打开乱码问题的解决
    android 解决输入法遮挡输入框的问题
    repo代码简单解读
  • 原文地址:https://www.cnblogs.com/longdouhzt/p/2505145.html
Copyright © 2011-2022 走看看