`
dacoolbaby
  • 浏览: 1254346 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Python 高级之 __attr__ 对象属性

阅读更多

Python一切皆对象(object),每个对象都可能有多个属性(attribute)。Python的属性有一套统一的管理方案。

 

对象的属性可能来自于其类定义,叫做类属性(class attribute)。

类属性可能来自类定义自身,也可能根据类定义继承来的。

一个对象的属性还可能是该对象实例定义的,叫做对象属性(object attribute)。

对象的属性储存在对象的__dict__属性中。

__dict__为一个词典,键为属性名,对应的值为属性本身。我们看下面的类和对象。

 

对应Java的反射中,来获取对象的属性,如:

public class UserBean {
    private Integer id;
    private int age;
    private String name;
    private String address;
}

//类实例化
UserBean bean = new UserBean();
bean.setId(100);
bean.setAddress("武汉");

//得到类对象
Class userCla = (Class) bean.getClass();
      
//得到类中的所有属性集合
Field[] fs = userCla.getDeclaredFields();
......

 

class bird(object):
    feather = True

class chicken(bird):
    fly = False
    def __init__(self, age):
        self.age = age

summer = chicken(2)

print(bird.__dict__)
print(chicken.__dict__)
print(summer.__dict__)

 

输出:

{'__dict__': <attribute '__dict__' of 'bird' objects>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'bird' objects>, 'feather': True, '__doc__': None}

{'fly': False, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x2b91db476d70>}

{'age': 2}

第一行为bird类的属性,比如feather。

第二行为chicken类的属性,比如fly和__init__方法。

第三行为summer对象的属性,也就是age。

有一些属性,比如__doc__,并不是由我们定义的,而是由Python自动生成。此外,bird类也有父类,是object类(正如我们的bird定义,class bird(object))。这个object类是Python中所有类的父类。

 

也就是子类的属性,会覆盖父类的属性。

 

可以通过下面2中方法修改类的属性:

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

summer.age = 5
print(summer.age)

 

 

Python中的property

同一个对象的不同属性之间可能存在依赖关系。当某个属性被修改时,我们希望依赖于该属性的其他属性也同时变化。这时,我们不能通过__dict__的方式来静态的储存属性。Python提供了多种即时生成属性的方法。其中一种称为特性(property)。

 

class bird(object):
    feather = True

#extends bird class
class chicken(bird):
    fly = False
    def __init__(self, age):
        self.age = age
    def getAdult(self):
        if self.age > 1.0: 
			return True
        else: 
			return False
    adult = property(getAdult)   # property is built-in

summer = chicken(2)

print(summer.adult)
summer.age = 0.5
print(summer.adult)

这里的功能类似于触发器。在每次获取adult属性的时候,会触发getAdult的值。

 

特性使用内置函数property()来创建。property()最多可以加载四个参数。前三个参数为函数,分别用于处理查询特性、修改特性、删除特性。最后一个参数为特性的文档,可以为一个字符串,起说明作用。 

 

class num(object):
    def __init__(self, value):		
		self.value = value
		print '<--init'
    def getNeg(self):
		print '<--getNeg'
		return self.value * -1
    def setNeg(self, value):
		print '<--setNeg'
		self.value = (-1) * value
    def delNeg(self):
		print("value also deleted")
		del self.value
    neg = property(getNeg, setNeg, delNeg, "I'm negative")

x = num(1.1)
print(x.neg)
x.neg = -22
print(x.value)
print(num.neg.__doc__)
del x.neg

 整个过程之中,都没有调用对应的几个函数。

也就是说,neg这个属性的创建,设置,删除都通过property()注册起来了。

 

Python特殊方法__getattr__ (这个常用)

我们可以用__getattr__(self, name)来查询即时生成的属性。

在pyhton中,对象属性都是动态的,随时可以根据需要添加或者删除属性。

那么getattr的作用就是,在产生这些属性的时候,进行一层判断处理操作。

比如:

class bird(object):
    feather = True

class chicken(bird):
    fly = False
    def __init__(self, age):
		self.age = age
    def __getattr__(self, name):
		if name == 'adult':
			if self.age > 1.0: 
				return True
			else: 
				return False
		else: 
			raise AttributeError(name)

summer = chicken(2)

print(summer.adult)
summer.age = 0.5
print(summer.adult)

print(summer.male)

 

每个特性需要有自己的处理函数,而__getattr__可以将所有的即时生成属性放在同一个函数中处理。__getattr__可以根据函数名区别处理不同的属性。比如上面我们查询属性名male的时候,raise AttributeError。

 

(Python中还有一个__getattribute__特殊方法,用于查询任意属性。

__getattr__只能用来查询不在__dict__系统中的属性)

__setattr__(self, name, value)和__delattr__(self, name)可用于修改和删除属性。

它们的应用面更广,可用于任意属性。

分享到:
评论

相关推荐

    celeba_vgg19_256_2_0_28_attr.pth

    fsgan预训练模型shared中的celeba_vgg19_256_2_0_28_attr.pth。

    Python面向对象之类的内置attr属性示例

    主要介绍了Python面向对象之类的内置attr属性,结合实例形式分析了Python面向对象中类的属性相关定义、赋值、修改等操作技巧与注意事项,需要的朋友可以参考下

    Python __setattr__、 __getattr__、 __delattr__、__call__用法示例

    主要介绍了Python __setattr__、 __getattr__、 __delattr__、__call__用法示例,本文分别对这几个魔法方法做了讲解,需要的朋友可以参考下

    Python中__new__与__init__方法的区别详解

    新式类对象可以直接通过__class__属性获取自身类型:type  2. 继承搜索的顺序发生了改变,经典类多继承时属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧(即深度优先搜索);新式类多继承属性搜索顺序: 先水平...

    hdf_sd_attr.rar_IDL HDF_SD_IDL hdf EOS_attr_hdf

    文件是基于IDL开发环境的读取EOS的HDF文件格式的代码,并且提供了在IDL中实现循环、判断等操作,以及以一定的格式写文件的方法。

    统一数据库访问接口库(Windows平台)

    Windows(x86)系统下统一数据库操作接口库; 支持国产达梦数据库(通过dpi接口集成),支持mysql数据库(通过libmysqlclient集成),支持...提供抽象的结果表对象(result_table)和结果集对象(result_set),满足不同的使用习惯;

    深入了解Python 方法之类方法 & 静态方法

    昨天的文章 详解类方法之绑定方法与非绑定方法 中写了方法中的绑定方法和非绑定方法,今天我们继续来学习剩下的「类方法」和「静态方法」。 类方法 & 静态方法 在开始之前,先让我们来看下面一段代码: class ...

    C语言线程调度与优先级配置示例

    通过配置线程调度策略与优先级,可使各线程按照设定的顺序执行,从而达到线程间同步的目的,线程属性配置函数包括: ... pthread_attr_setinheritsched(&attr[i], PTHREAD_EXPLICIT_SCHED)设置线程属性

    老男孩第三期Python全栈开发视频教程 零基础系统学习Python开发视频+资料

    ├─(83) 02 python s3 day52 ORM多表操作之一对多查询之对象查询.avi ├─(84) 04 python s3 day52 ORM多表操作之一对多查询之双下划线查询.avi ├─(85) 05 python s3 day52 ORM多表操作之多对多添加记录.avi ├─...

    tjh_batch_attr_set批量属性属性修改Maya插件1.0.7更新1

    2、点击主菜单setting&gt;Create Multi blank Attrs... ,设置自定义添加属性类型数量 3、原有的Attributes Catche

    Android自定义Attr属性

    Android自定义Attr属性 的具体使用例子,看完之后,你就知道如何自定义控件的属性

    python学习-19-dyn-attr-prop.zip

    Python是一种解释型的、面向对象的、带有动态语义的高级程序设计语言。它是由荷兰人吉多·罗萨姆于1989年发布的,第一个公开发行版发行于1991年。Python注重解决问题的方法,而不是语法和结构。它被广泛应用于各个...

    python入门到高级全栈工程师培训 第3期 附课件代码

    03 ORM多表操作之一对多查询之对象查询 04 ORM多表操作之一对多查询之双下划线查询 05 ORM多表操作之多对多添加记录 06 ORM多表操作之多对多查询 07 ORM多表操作之F查询与Q查询 08 ORM的querySet集合对象的特性 第...

    facenet_celeb_ncs.graph

    在树莓派+计算棒上使用的一个文件,用于实现人脸识别,实测可用,demo位置是/home/pi/tools/ncappzoo/apps/video_face_matcher_multipleFace 博客地址:https://blog.csdn.net/Jun626/article/details/105917622

    Python实现计算对象的内存大小示例

    本文实例讲述了Python实现计算对象的内存大小。分享给大家供大家参考,具体如下: 一般的sys.getsizeof()显示不了复杂的字典。 查看类中的内容: def dump(obj): for attr in dir(obj):#dir显示类的所有方法 ...

    Python黑魔法Descriptor描述符的实例解析

    数据描述符是指实现了__get__,__set__,__del__方法的类属性(由于Python中,一切皆是对象,所以你不妨把所有的属性也看成是对象) PS:个人觉得这里最好把数据描述符等效于定义了__get__,__set__,__del__三个方法的接口...

    attr_extras, 使用attr_initialize之类的方法从 ruby 中取出一些样板.zip

    attr_extras, 使用attr_initialize之类的方法从 ruby 中取出一些样板 attr_extras从 ruby 中提取一些样板,降低了提取小型聚焦类的障碍,而不考虑使用 Struct 函数的缺点。代替class InvoiceBuilder def initialize...

    time_of_day_attr:Ruby宝石,用于掌握Rails中的一天中的时间属性

    gem install time_of_day_attr 用法 定义时间属性: class BusinessHour &lt; ActiveRecord xss=removed xss=removed&gt; 32400 business_hour . closing =&gt; 61200 转换回一天中的时间: TimeOfDayAttr . l ( b

Global site tag (gtag.js) - Google Analytics