第八章python元类编程

1.property动态属性

  一般对象中的属性使用单下划线或双下划线开头的都是伪私有类型,对于单下划线开头的属性(表示为protected类型)直接可以通过对象访问,而双下滑线开头的属性(表示private类型)必须使用对象.__类名__私有属性名即可访问

 1 class Test:
 2     def __init__(self):
 3         self.__t1 = "t1"
 4         self._t2 = "t2"
 5
 6
 7 test = Test()
 8 print(test._Test__t1, test._t2)  # t1 t2
 9
10 test._Test__t1 = "Test_t1"
11 test._t2 = "Test_t2"
12 print(test._Test__t1, test._t2)  # Test_t1 Test_t2

  大家应该遵守一个约定就是不要对伪私有类型进行赋值等操作,我们应该使用函数调用的方式,为了让程序更加优雅,我们有装饰器@property让函数变为对象的属性

  • @property:设置age为对象属性默认隐藏掉__age,并且设置age像普通属性一样,使用user.age来获得值
  • @age.setter:设置@property修饰过的属性的赋值操作像普通属性一样,使用user.age = 65来赋值
 1 class User:
 2     def __init__(self, name):
 3         self.name = name
 4         self.__age = 0
 5
 6     # 一般的函数调用
 7     def get_age(self):
 8         return self.__age
 9
10     # __age的get方法
11     @property
12     def age(self):
13         return self.__age
14
15     # __age的set方法
16     @age.setter
17     def age(self, value):
18         if value > 150 or value < 0:
19             raise ValueError(‘invalid age‘)
20         self.__age = value
21
22
23 if __name__ == "__main__":
24     user = User("user1")
25     user.age = 35
26     print(user.age)  # 35
27
28     user._User__age = 65
29     print(user._User__age, user.age)  # 65 65
30     print(user.get_age())  # 65

2.__getattr__、__getattribute__魔法函数

  • __getattribute__:当访问属性时,都会进入这个魔法函数
  • __getattr:当访问属性时,没有找到访问的属性则调用这个魔法函数
 1 class User:
 2     def __init__(self, info={}):
 3         self.info = info
 4
 5     def __getattr__(self, item):
 6         return self.info[item]
 7
 8     # def __getattribute__(self, item):
 9     #     return "getattribute"
10
11
12 if __name__ == "__main__":
13     user = User(info={"company_name": "imooc", "name": "bobby"})
14     print(user.name)  # imooc

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

1.什么是属性描述符
  实现了__get__、__set__、__delete__中的任意一个方法的类,称为属性描述符

2.什么是数据描述符

  实现__get__、__set__两个方法的类

3.什么是非数据描述符

  只实现__get__方法的类

4.属性的查找

  如果test_user是User类的实例,test_user.age 等价与getattr(test_user,‘age‘)

执行test_user.age步骤:

  1. 调用__getattribute__

    1. 如果没有找到属性age,则__getattribute__抛出AttributeError再调用__getattr__
    2. 如果可以找到age,则调用__get__

进入__getattribute__整体流程:

 1 import numbers
 2
 3
 4 class IntField:
 5     # 数据描述符
 6     def __get__(self, instance, owner):
 7         return self.value
 8
 9     def __set__(self, instance, value):
10         if not isinstance(value, numbers.Integral):
11             raise ValueError("int value need")
12         if value < 0:
13             raise ValueError("positive value need")
14         self.value = value
15
16     def __delete__(self, instance):
17         pass
18
19
20 class NonDataIntField:
21     # 非数据属性描述符
22     def __get__(self, instance, owner):
23         return self.value
24
25
26 class User:
27     age = IntField()
28     # age = NonDataIntField()
29
30
31 if __name__ == "__main__":
32     test_user = User()
33     test_user.age = 1
34     print(test_user.__dict__, User.__dict__)
35     print(test_user.age)
36     pass
37     pass
38     # print(dir(test_user))
39     # print(test_user.age)

4.__new__和__init__的区别

5.自定义元类

6.元类实现简单的orm

原文地址:https://www.cnblogs.com/zhihaospace/p/12094471.html

时间: 2024-08-28 20:17:57

第八章python元类编程的相关文章

python元类编程

什么叫元类?   年轻人先不要在意这些细节.我们一步一步的来! 001. oop的世界里有一句话 "万物皆对象" class Person(object): name=None if __name__=="__main__": i=123 s="hello world" p=Person() print(type(i)) #<class 'int'> print(type(s)) #<class 'str'> print(

python3 元类编程的一个例子

[引子] 虽然我们可以通过"class"语句来定义"类",但是要想更加细粒度的控制"类"的创建,要使用元类编程才能实现. 比如说我们要实现这样的一个约束.所有项目中用到的类都应该要为它定义的方法提供文档字符字符串.有两条可行 的路径 1):依赖工程师的自觉.自律 让他们在定义每一个方法的时候都为方法增加文档字符串, 2):通过元类来做一些 控制,如果工程师没有为方法提供文档字符,那么就直接报错,直到工程师为方法提供字符串为止. [实现1] 依赖工

python元类__metaclass__

<pre name="code" class="python">#python元类,类的创建过程 #首先调用type.__new__ #然后调用类的构造函数 class.__init__ def toString(c): s=""; if type(c)==tuple: s="tuple:" for i in c: s+=str(i) s+="," return s elif type(c) =

Python元类

学懂元类,首先要知道两句话: 道生一,一生二,二生三.三生万物 我是谁?我从哪里来?我要到那里去? 在Python的世界里,拥有一个永恒的道:type,如此广袤无垠的Python生态圈,都是由type产生出来的. 道生一,一生二,二生三,三生万物. 道:即就是type 一:即是metaclass 二:即是class(或者实例生成器) 三:即是instance 1 关于类 道和一,是我们今天讨论的命题,而二.三.和万物,则是我们常常使用的类.实例.属性和方法,用hello world来举例: 1

深入理解python元类

类也是对象 在理解元类之前,你需要先掌握Python中的类.Python 中的类概念借鉴 Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.当然在 Python 中这一点也是成立的. >>> class ObjectCreator(object): ... pass ... >>> my_object = ObjectCreator() >>> print my_object <__main__.

python元类分析

刚开始接触到Python新式类中的元类的概念的时候很是纠结了下..不知道这是个啥东西... 用以下几个定义来说明吧: (1)Python中,类也是对象..只不过这种对象比较的特殊,他用于创建别的对象 (2)元类也是一种类,只不过它更特殊...他是用来创建别的类的类...(呵呵,是不是很拗口) 先来看一段代码吧: class Fjs(object): def __init__(self, name): self.name = name def hello(self): print "hello b

python 元类的简单解释

本文转自博客:http://www.cnblogs.com/piperck/p/5840443.html 作者:piperck python 类和元类(metaclass)的理解和简单运用 (一) python中的类 首先这里讨论的python类,都基于继承于object的新式类进行讨论. 首先在python中,所有东西都是对象.这句话非常重要要理解元类我要重新来理解一下python中的类 class Trick(object): pass 当python在执行带class语句的时候,会初始化一

Python元类的一些应用

最近刚接触python的元类,网络上有比较详细的介绍,这里是在看Django时候发现一点关于元类的应用,做个笔记. from django.utils import six class A(type):     def __new__(cls, name, parents, attrs):         return type.__new__(cls, name, parents, attrs) class C(six.with_metaclass(A)):     pass 创建C类的时候,

元类编程-- metaclass

#类也是对象,type创建类的类 def create_class(name): if name == "user": class User: def __str__(self): return "user" return User elif name == "company": class Company: def __str__(self): return "company" return Company #type动态创