zoukankan      html  css  js  c++  java
  • python 学习笔记7(类/对象的属性;特性,__getattr__)

    27. 属性的__dict__系统

    1)对象的属性可能来自:

    • 其类的定义,叫做类属性
    • 继承父类的定义
    • 该对象实例定义(初始化对象时赋值),叫做对象属性

    2)对象的属性存储在对象的 __dict__ 属性中:

    • __dict__ 为字典,键为属性名,值是属性本身。

    例子:

    class bird(object):
        feather = True         # 父类
    
    class chicken(bird):
        fly = False
        def __init__(self, age):
            self.age = age     # 子类
    
    summer = chicken(2)        # 子类的对象
    
    print(bird.__dict__)       # 父类属性
    {'__dict__': <attribute '__dict__' of 'bird' objects>,   '__module__': '__main__',   '__weakref__': <attribute '__weakref__' of 'bird' objects>,   'feather': True, '__doc__': None}
    print(chicken.__dict__)    # 子类属性
    {'fly': False, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x2b91db476d70>}
    print(summer.__dict__)     #对象属性
    {'age': 2}

    3)属性是分层定义的:

    比如上面分为 object / bird / chicken / summer这四层。

    当我们需要调用某个属性的时候,Python会一层层向上遍历,直到找到最近那个属性。

    __class__ 和 __base__

    __class__属性可以帮对象查询它的类;

    __base__属性可以帮子类查询它的父类

    4)修改/引用对象的属性

    下面两重方式互相等价:

    summer.__dict__['age'] = 3       print(summer.__dict__['age'])
    summer.age = 3                   print(summer.age)

    28. 特性 property

    __dict__ 是以静态方式存储属性。而有时,我们希望即时生成属性,比如a〉5时,b为true;a<=5时,b就是false,b是依赖a的。

    特性是一种办法,通过内置函数property() 来创建。最多有四个参数:

    • 函数1,用于处理查询特性
    • 函数2,修改特性
    • 函数3,删除特性
    • 最后一个参数为特性的文档,可以为一个字符串,起说明作用

    例子:

    class num(object):
        def __init__(self, value):
            self.value = value
        def getNeg(self):
            return -self.value                                ## 参数1
        def setNeg(self, value):
            self.value = -value                               ## 参数2
        def delNeg(self):
            print("value also deleted")
            del self.value                                    ## 参数3
        neg = property(getNeg, setNeg, delNeg, "I'm negative")## 特性

    x=num(-1.1)

    print( x.neg)     # neg 是x的值的相反数

    print( x.value)

    还可以修改neg值: x.neg= 22,

    此时                    print (x.value)  #x.value 也发生改变,为-22

    29.  特殊方法 __getattr__ 也可以即时生成属性

    __getattr__ 是一个特殊方法,可以查询一个即时属性。如果不存在,可以创建之。

    class bird(object):
        feather = True
    
    class chicken(bird):
        fly = False
        def __init__(self, age,part):
            self.age  = age
    self.part = part def __getattr__(self, name): # 查询 adult 这个即时属性,如果不存在,重建 if name == 'adult': if self.age > 1.0: return True else: return False
            elif name == 'male':               # 查询 male 这个即时属性,如果不存在,重建
                if self.part=10: return True
                else: return False
            else: raise AttributeError(name)   # 查询adult,male之外的属性,报错!
    summer = chicken(2,5)  # 此时 print(summer.adult), 为True
    summer.part = 0.5     # 此时 print(summer.male),为False
    print(summer.your) # your, 抛出异常!

     

    注: 还有一些其它的方式可以即时生成属性,慢慢积累学习吧。

  • 相关阅读:
    mysql时区设置
    jquery raidio buttion checked unchecked
    mysql定时备份
    丁香园 (http://www.dxy.cn)这个名字听着
    mysql backup solution
    mysql备份
    mysql编码设置
    在Ubuntu中通过源码安装编译安装软件(MySQL篇) 收藏
    社会化分享实现插件,分享到...
    ubuntu 小工具
  • 原文地址:https://www.cnblogs.com/skyEva/p/5468506.html
Copyright © 2011-2022 走看看