Python菜鸟晋级06----特殊属性整理

Python一切皆对象(object),每个对象都可能有多个属性(attribute)。

#现在我们来总结下所有的系统定义属性和方法, 先来看下保留属性:

>>> 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}

属性的__dict__系统

对象的属性可能来自于其类定义,叫做类属性(class attribute)。类属性可能来自类定义自身,也可能根据类定义继承来的。一个对象的属性还可能是该对象实例定义的,叫做对象属性(object attribute)

对象的属性储存在对象的__dict__属性中。__dict__为一个词典,键为属性名,对应的值为属性本身。

class Bird:
    """鸟类父类"""
    have_feather = True                                      
    way_of_reproduction  = "egg"  
    song="叽叽喳喳"  
    def sing(self):                                          
        print(self.song)  
    def move(self):  
        print("飞飞飞飞飞")
class Chicken(Bird):
    """鸟类子类"""
    song="喔喔喔喔喔!"
    def __init__(self,name):
        self.name=name
    def move(self):                                                                                                   
        print("跑跑跑跑跑")
myChicken=Chicken("aQ")  

print(Bird.__dict__)
print(Chicken.__dict__)
print(myChicken.__dict__)
输出

{'move': <function Bird.move at 0x02FDB2B8>, 'have_feather': True, 'way_of_reproduction': 'egg', '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Bird' objects>, 'song': '叽叽喳喳', '__dict__': <attribute '__dict__' of 'Bird' objects>, '__doc__': '鸟类父类', 'sing': <function Bird.sing at 0x02FDB270>}                                                                                           #父类的属性
{'move': <function Chicken.move at 0x02FDB348>, '__module__': '__main__', '__init__': <function Chicken.__init__ at 0x02FDB300>, 'song': '喔喔喔喔喔!', '__doc__': '鸟类子类'}                 #子类的属性
{'name': 'aQ'}                                                                                                                                                                                  #对象属性

 (上面的情况中,我们已经知道了summer对象的类为chicken,而chicken类的父类为bird。如果只有一个对象,而不知道它的类以及其他信息的时候,我们可以利用__class__属性找到对象的类,然后调用类的__base__属性来查询父类。例如输入print(myChicken.__class__),输出结果就是<class ‘__main__.Chicken‘>)

属性

格式

1.现在介绍第一种使用属性的方法:
  在该类中定义三个函数,分别用作赋值、取值和删除变量(此处表达也许不很清晰,请看示例)
 class Test:
 def __init__(self):
  self.__x=None
  def getx(self):
  return self.__x
 def setx(self,value):
  self.__x=value
 def delx(self):
  del self.__x
 x=property(getx,setx,delx,'')
property函数原型为property(fget=None,fset=None,fdel=None,doc=None),所以根据自己需要定义相应的函数即可。
  
2.下面看第二种方法(在2.6中新增)
  
class C:
    def __init__(self):
        self.__x=None
    @property
    def x(self):
       return self.__x
    @x.setter
    def x(self,value):
        self.__x=value
    @x.deleter
    def x(self):
        del self.__x
 同一属性的三个函数名要相同。调用的时候  对象.x就可以了

作用

1 通过在类类里设计property也可让类具有运算功能
2 隐藏了变量名,变量名和方法名不相同,数据安全了!

class test():
    "property应用举例"
    def __init__(self,value):
        self.value=value
    def getValue(self):
        print("自动调用取值")
        return self.value
    def setValue(self,value):
        print("自动执行赋值")
        if value>100:
            self.value=100
            print("值大于100则赋值为100")
        else:
            self.value=value
    def delValue(self):
        del(self.value)
        print("删除成功")
    num=property(getValue,setValue,delValue,'测试')
a=test(3)
print(a.num)
a.num=200
print(a.value)
del(a.num)
输出

自动调用取值
3
自动执行赋值
值大于100则赋值为100
100
删除成功



上一讲:Python菜鸟晋级05----with....as....(上下文管理器)

下一讲:

如果有什么疑问欢迎到我的微信公众号提问~
技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。