VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > 简明python教程 >
  • PythonI/O进阶学习笔记_7.python动态属性,__new__和__init__和元类编程(上)

content:

上:

1.property动态属性

2.__getattr__和__setattr__的区别和在属性查找中的作用

3.属性描述符 和属性查找过程

4.__new__和__init__的区别

下:

5.什么是元类和自定义元类

6.用元类实现orm

=============================

一.property动态属性

1.什么是property?

  在面向对象编程中,我们一般把名词性的东西映射成属性,动词性的东西映射成方法。在python中他们对应的分别是属性self.xxx和类方法。
但是有时候,我们需要对传递进来的属性进行限制、检测等操作, 此时如果直接使用属性方法处理,可能会导致数据不同步就可以用@property方法来动态创建类属性。

2.property的作用

a. 拦截类的创建
b. 拦截下后,进行修改
c. 修改完后,返回修改后的类

3.property的简单应用

一个User类生成的user对象,需要实现传递进去的参数为年月日而计算得到age属性。

复制代码
 1 from datetime import date,datetime
 2 class User:
 3     def __init__(self,name,birthday):
 4         self.name=name
 5         self.birthday=birthday
 6         self._age=0
 7         self._age2=0
 8     def get_age(self):
 9         return datetime.now()-self.birthday.year
10     @property
11     def age(self):
12         return datetime.now().year-self.birthday.year
13     @age.setter
14     def age(self,value):
15         self._age,self.age2=value
16         #return self._age
17 user=User("tanrgong",date(year=1996,month=12,day=25))
18 print(user.age)
19 user.age=(1,2)
20 print(user.age)
21 print(user._age)
22 print(user._age2)
复制代码
output:
23
23
1
2

 

二.__getattr__和__setattr__的区别和在属性查找中的作用

1.__getattr__

  _getattr__在查找不到属性的时候调用。 __getattr__在当前主流的Python版本中都可用,重载__getattr__方法对类及其实例未定义的属性有效。也就是说,如果访问的属性存在,就不会调用__getattr__方法。这个属性的存在,包括类属性和实例属性。
当调用一个类不存在的属性的时候,报错输出为AtttibuteError:

 在自己重新定义了__getattr__方法后:

 打印了我们定义的字符串,返回了None。如果将print改为return,则会直接返回字符串。

简单应用:
    比如说,我们现在用户有更加详细的信息。用来维护一个dict。将dict的访问方式变为对象属性访问方式。

相关教程