第十三章、元类之控制类的调用过程

目录

  • 第十三章、元类之控制类的调用过程

    • 一、__call__

第十三章、元类之控制类的调用过程

一、__call__

作用:控制类的调用过程,实际上在控制:对象的产生

  • 控制名称空间

     class Mymeta(type):
          def __call__(self,*args, **kwargs):
              obj=self.__new__(self)#生成空对象
              obj.__init__(*args, **kwargs)#调用obj的__init__()
              obj.__dict__['attr']=kwargs
              return obj
    
      class Mydict(dict,metaclass=Mymeta):
          def __getattr__(self, item):
              return self.__dict__['attr'][item]
    
          def __setattr__(self, key, value):
              self[key]=value
              self.__dict__['attr'][key] = value
      ----------------------------------------------------
      di=Mydict(name='nick',age=18)
      print(di.__dict__)
      print(di.name)
      di.sex='male'
      print(di)
      print(di.__dict__)
      -----------------------------------------------------
      {'attr': {'name': 'nick', 'age': 18}}
      nick
      {'name': 'nick', 'age': 18, 'sex': 'male'}
      {'attr': {'name': 'nick', 'age': 18, 'sex': 'male'}}
  • 例2练习:给我吧对象中的所有属性都设置成私有的
    class Mymeta(type):
        def __call__(self, *args, **kwargs):
            obj=object.__new__(self)
            obj.__init__(*args, **kwargs)
            # print(obj.__dict__)
            obj.__dict__={ '_%s__%s'%(self.__name__,k):v for k,v in obj.__dict__.items()}
            # print(obj.__dict__)
            return obj
    
    class Person(object, metaclass=Mymeta):
        school = 'oldboy'
        def __init__(self, name):
            self.name = name
        def score(self):
            print('分数是100')
    p = Person(name='nick')
    print(p.__dict__) #{'_Person__name': 'nick'}
    print(p.name)     #会报错

原文地址:https://www.cnblogs.com/demiao/p/11456347.html

时间: 2024-11-07 09:28:17

第十三章、元类之控制类的调用过程的相关文章

面向对象,元类,控制类,对象的创建

""" call 调用的意思 ? 在在对象被调用时 执行 函数 类 自定义元类 的目的 ? 1.可以通过call 来控制对象的创建过程 ? 2.可用控制类的创建过程 """ 自定义一个元类 元类也是一个类 但是需要继承type class MyMeta(type):?self 表示要创建对象的那个类(Person) *args是调用Person类时传入的参数??  def __call__(self, *args, **kwargs):??   

通过元类来控制类的产生

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

UML 边界类、控制类、实体类

来源:http://bbs.csdn.net/topics/300192417 UML中类有三种主要的版型:边界类.控制类和实体类.引入边界类.控制类及实体类的概念有助于分析和设计人员确定系统中的类. 边界类位于系统与外界的交界处,窗体.报表.以及表示通讯协议的类.直接与外部设备交互的类.直接与外部系统交互的类等都是边界类.通过用例图可以确定需要的边界类,每个Actor/Use Case对至少要一个边界类,但并非每个Actor/Use Case对要唯一的边界类. 实体类保存要放进持久存储体的信息

【C++ Primer 第十三章】4. 拷贝控制示例

拷贝控制示例 1 #include<iostream> 2 #include<string> 3 #include<set> 4 using namespace std; 5 6 class Folder; 7 8 class Message { 9 friend void swap(Message&, Message&); 10 friend class Folder; 11 public: 12 explicit Message(const stri

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

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

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.什么叫元类

控制类及其调用过程

class Mymeta(type): def __init__(self,class_name,class_bases,class_dic): #控制类Foo的创建 super(Mymeta,self).__init__(class_name,class_bases,class_dic) def __call__(self, *args, **kwargs): #控制Foo的调用过程,即Foo对象的产生过程 obj = self.__new__(self) self.__init__(obj,

java-第十三章-类的无参方法(一)-查找客户姓名

package 上机练习; public class A02class { String names[] = new String[30]; public void showA(String name) { for (int i = 0; i < names.length; i++) { if (names[i] == null) { names[i] = name; break; } } } public void showB() { System.out.println("\t客户列表

java-第十三章-类的无参方法(一)-实现图形生成器

package 上机练习; public class A03class { public String showA(int rows, String ch) { for (int i = 0; i < rows; i++) { for (int j = 0; j <= i; j++) { System.out.print(ch); } System.out.println(); } return ch; } } package 上机练习; import java.util.Scanner; p