zoukankan      html  css  js  c++  java
  • 基础知识回顾——属性

    Python一切皆对象(object),每个对象都可能有多个属性(attribute)。其属性可能来自类定义或类继承,这叫类属性,也可能来自实例对象的属性,这叫实例属性

    不同实例的实例属性可能不同,不同实例的类属性都相同。所以一般把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性。

    属性

    定义属性:类.属性 = 值 或者 实例.属性 = 值

    调用属性:类().属性() 或者 实例.属性() 或者 实例.属性

     1 >>> class Person:
     2       def think(self):
     3           print "To be or not to be is a question"
     4 
     5 >>> class Women(Person):
     6       def gender(self):
     7           print "she may be a girl or a lady"
     8 
     9         
    10 >>> Ryana = Women()        #实例化一个子类Women对象Ryana
    11 >>> Ryana.think()         #通过实例.属性()调用 
    12 To be or not to be is a question  
    13 >>> Women().gengder()    #通过类().属性()调用,类()等价于类实例
    14 she may be a girl or a lady
    15 >>> Ryana.age = 18          #定义实例属性
    16 >>> Person.speak = 'hello'    #类之外,定义类属性
    17 >>> Ryana.speak         #注意没有(),因为调用的是类的字符串属性,不是类方法
    18 'hello'
    19 >>> Person.__dict__
    20 {'__module__': '__main__', 'speak': 'hello', 'think': <function think at 0x03DEDEF0>, '__doc__': None}
    21 >>> women.__dict__
    22 {'gengder': <function gengder at 0x03DEDF30>, '__module__': '__main__', '__doc__': None}
    23 >>> Ryana.__dict__
    24 {'age': 18}
    25 >>> Echo = Person()         #实例化一个父类Person对象Echo
    26 >>> Echo.think()
    27 To be or not to be is a question
    28 >>> Echo.speak
    29 'hello'
    30 >>> Echo.gender       #类的继承方式由下到上
    31 
    32 Traceback (most recent call last):
    33   File "<pyshell#20>", line 1, in <module>
    34     Echo.gengder
    35 AttributeError: Person instance has no attribute 'gender'
    36 >>> Echo.__dict__
    37 {}

     查询类或对象的属性除了访问类的字典属性 __dict__,还可以用内建函数dir()查看类或者对象的所有属性。

    >>> dir(Person)
    ['__doc__', '__module__', 'speak', 'think']
    >>> dir(Women)
    ['__doc__', '__module__', 'gengder', 'speak', 'think']

    从上面的属性可知,除了类自定义的属性,还有__doc__,__module__,这类属性称为特殊属性,常见的特殊属性有:

     1 >>> women.__bases__  #类的所有父类构成的元组
     2 (<class __main__.Person at 0x03834ED8>,)
     3 >>> women.__doc__     #类的文档字符串
     4 >>> women.__name__   #类的名字(字符串)
     5 'women'
     6 >>> women.__module__  #类定义所在的模块
     7 '__main__'
     8 >>> Ryana.__class__    #实例对应的类
     9 <class __main__.women at 0x03C7A5E0>
    

    类属性与实例属性冲突

     1 >>> class f:
     2       a = 10
     3 
     4 #实例化对象obj1和obj2从类f继承属性a
     5 >>> obj1 = f()
     6 >>> obj2 = f()
     7 >>> print obj1.a , obj2.a , f.a
     8 10 10 10
     9 
    10 #实例化对象obj1自定义实例属性obj1.a = 12
    11 >>> obj1.a = obj1.a + 2   #等价于obj1.a += 2
    12 >>> print obj1.a , obj2.a , f.a
    13 12 10 10
    14 
    15 #改变类f的属性,由于对象obj1的实例属性a和类f的类属性a命名冲突,所以对象obj1将屏蔽类属性
    16 >>> f.a = f.a + 3
    17 >>> print obj1.a , obj2.a , f.a
    18 12 13 13

    Python中属性是按照从下到上的顺序来查找;当删除实例属性后,再使用相同的名称,访问到的将是类属性。

  • 相关阅读:
    iOS开发objectc优势与补足
    UITableView详解
    ipad 、iphone开发-通过定时器显示进度条
    [Yii Framework][SHARE] The directory structure of the Yii project site
    [Yii Framework] Yii中事件和行为的区别和应用
    [Ubuntu] 创建桌面启动图标
    [Ubuntu] Access denied for user ‘debiansysmaint’@'localhost’ (using password: YES)
    [Yii Framework] Chive: which is developed base on Yii, and its aims to be an alternative to phpMyAdmin!
    [javascript] 数组扩展操作
    [php] Generate PhpDoc with NetBeans
  • 原文地址:https://www.cnblogs.com/Ryana/p/6250085.html
Copyright © 2011-2022 走看看