Python----面向对象---自定义元类控制类的实例化行为

一、知识储备

1、__call__方法

 1 class Foo:
 2     def __call__(self, *args, **kwargs):
 3         print(self)
 4         print(args)
 5         print(kwargs)
 6
 7 obj = Foo()
 8 obj()
 9
10 结果为:
11
12 <__main__.Foo object at 0x000002AFE2B4BDA0>
13 ()
14 {}

实例化时传参

1 obj(1, 2, 3, a=1, b=2, c=3)
2
3 结果为:
4
5 <__main__.Foo object at 0x000001A1799CBDA0>
6 (1, 2, 3)
7 {‘a‘: 1, ‘b‘: 2, ‘c‘: 3}

原文地址:https://www.cnblogs.com/xudachen/p/8660844.html

时间: 2024-11-09 09:04:50

Python----面向对象---自定义元类控制类的实例化行为的相关文章

1.元类介绍/2.自定义元类控制类的行为/3.控制类的实例化行为/4.控制类的实例化行为的应用

1.元类介绍 1.储备知识exec()参数1;字符串形式得命令参数2.全局作用域(字典形式),如果不指定默认就使用globals()参数3.局部作用域(字典形式),如果不指定默认就使用locals() 2.python 一切皆对象 ,对象可以怎么用? 2.1. 都可以被引用 x=obj 2.2. 都可以当作函数得参数传入 2.3. 都可以当作函数得返回值 2.4. 都可以当作容器类得元素 li=[func,time] # 类也是对象,Foo=type() 类是属于type() 类 3.什么叫元类

2.自定义元类控制类的创建行为

工作中,现有的类可能不能满足实际的个性化需求,那么我们需要自己定义元类来控制类的行为 本篇是对自定义元类控制类的创建行为的理解 自定义元类控制类型为分创建行为和实例化行为,其中控制创建行为是通过__Init__方法实现的. 1)我们知道,根据开发规范,类的名称是要大写的,但开发者不大写当然也可以运行的 2)开发者在创建类时,最好在类中加入一些注释,方便以后回头理解,也方便产品经理的理解,当然开发者不写这些注释也没关系 现在我要告诉你,类名必须大写!新建类必须要有注释!就是这么任性,哈哈 实现代码

通过元类控制类的产生

自定义元类:来控制类的产生:可以控制类名,可以控制类的集成父类,控制类的名称空间 type 自定义元类必须集成type,写一个类继承type 这种类都叫元类 class Mymeta(type): #def __init__(self,*args,**kwargs): def __init__(self,name,bases,dic): #sef就是Person类 print(name) print(bases) print(dic) #加限制 控制类名必须以sb开头 if not name.s

通过元类控制类的调用过程

__call__ 控制类的调用过程,实际上在控制:对象的产生 class Mymeta(type): def __call__(self,*args,**kwargs): #print('xxx') return 1 class Person(object,metaclass=Mymeta): school = 'oldboy' def __init__(self,name): self.name =name def score(self): print('分数是100') p =Person(

自定义元类控制类的实例化行为

#只是储备 __call__方法:# class Foo:# def __call__(self, *args, **kwargs):# print(self)# print(args)# print(kwargs)# obj = Foo()# obj(1, 2, 3, a = 5, g = 8)'''在python中一切都是对象, 此地,Foo也是对象,Foo可以加括号调用,所以 obj也可以加括号调用但是obj这个对象的类的内部必须有__call__方法,此地可以引出, Foo的元类内部也有

3.1.17 自定义元类控制类的实例化的应用--单实例模式

#单例模式#实现方式一:# class MySQL:# __instance=None #__instance=obj1## def __init__(self):# self.host='127.0.0.1'# self.port=3306## @classmethod# def singleton(cls):# if not cls.__instance:# obj=cls()# cls.__instance=obj# return cls.__instance### def conn(se

自定义元类控制类的实例化行为的应用

# 单例模式:对一个类多次实例化,但只实例化出同一个对象class Mymeta(type): def __init__(self,class_name,class_bases,class_dic): if not class_name.istitle(): raise TypeError('类名的首字母必须大写!') if '__doc__' not in class_dic or not class_dic['__doc__'].strip(): raise TypeError('必须有注释

Python面向对象之为何要用类

对于非程序员科班出身的技术人员,理解很多开发思想领域里面的事情,其实是一件挺痛苦的事情,直到接触到了Python当中的类,我才明白了什么是面向对象,更多的理解还是要通过实际的代码操练才能够慢慢的掌握. 今天记录一下什么是面向对象,在Python的编程世界里为什么要用到类. 一.面向对象 将大家共有的特性剥离出来进行抽象的过程就是面向对象,这是我对面向对象最直观的理解,例如我们在工厂生产汽车,每一款车都有自己的生产平台,试想一下这样的场景,A款车有100个工人在独立生产,其中20个人生产底盘,20

python 面向对象(成员,静态,类)的(变量,方法)区别

静态方法是使用@staticmethod装饰的方法,并且参数表中不需要self或者cls,可以访问类成员变量 默认的方法是有self的,是成员方法,可以访问私有变量和方法(通过self.xxx),或者访问类方法或变量(通过类名.方法名或变量名) 类方法使用@classmethod来装饰,参数表中不需要self,但需要cls参数和当前类关联.不能访问成员变量和方法,但是可以通过cls.xxx访问类方法或类变量 一下是参考了网上的一些大神的总结: 静态成员方法: 不能访问类属性,实例属性,相当于一个