首页 > 其他分享 >面向对象的魔法方法及元类

面向对象的魔法方法及元类

时间:2022-11-08 20:24:50浏览次数:52  
标签:__ name self 魔法 及元类 面向对象 print type class

魔法方法 

类中定义的双下方法都可以叫做魔法方法,其特定情况下可以自动触发运行

1. __init__
对象添加独有数据的时候自动触发
2. __str__
对象执行打印操作时自动触发
3. __call__
对象加括号调用的时候自动触发
4. __getattr__
对象点不存在的名字时自动触发
5. __getattribute__
对象点名字就会自动触发,其存在就不会执行__getattr__
6. __setattr__
给对象添加或修改数据的时候自动触发 对象.名字 = 值
7.__exit__
with上下文管理语法结束自动触发 8.__enter__ 当对象被当作with上下文管理操作的开始自动触发,
方法返回什么,as后面的变量名就会接收到什么

元类介绍

# 1.查看数据类型使用type
s1 = 'hello'
print(type(s1))    # <class 'str'>
# 2.type方法是用来查看产生对象的类名
class Student:
    pass
obj =Student()
print(type(obj))  # <class '__main__.Student'>
# 3.python中一切皆对象,使用type查看类名显示什么
class A:pass
class B:pass
print(type(A),type(B))  # <class 'type'> <class 'type'>

"""
最后我们得出结论:我们定义的类都是由type类产生的>>也就是产生类的类(元类)
"""

两种创建类的方式

# 方法1:利用元类type:    type(类名,类的父类,类的名称空间)
res = type('Teacher', (object,), {'name': 'tony'})
print(res)         # <class '__main__.Teacher'>
print(res.__dict__)   # 产生Teacher类名称空间,拿到Teacher类下的所有名字

了解知识:
"""
1.手动写键值对: 针对绑定方法不好定义
2.内置方法exec:能够运行字符串类型的代码并产生名称空间
"""
# 方法2:使用关键字class定义 class Teacher: school_name = '清华大学' def func(self): pass print(Teacher) # <class '__main__.Teacher'> print(Teacher.__dict__)

通过元类定制对象/定制类的产生行为

    类:

对象是由类名加括号产生  : __init__
类是由元类加括号产生 : __init__
# 1.自定义元类:继承type的类也被称为元类 class MyMetaClass(type): def __init__(self, what, bases = None, dict = None): if not what.istitle(): raise TypeError('python定义类,类名首字母必须大写') super().__init__(what,bases,dict) # 2.利用关键字metaclass指定类的元类 # class myclass(metaclass=MyMetaClass): # func = '类名小写可不可以' # 直接报错 class Teacher(metaclass=MyMetaClass): info = '每天上课很辛苦' # 正常运行 print(Teacher) # <class '__main__.Teacher'> print(Teacher.__dict__) # {'__module__': '__main__', 'info': '每天上课很辛苦', '__dict__': <attribute '__dict__' of 'Teacher' objects>, '__weakref__': <attribute '__weakref__' of 'Teacher' objects>, '__doc__': None}

    对象:

对象+()会执行产生该对象类里面的 : __call__
类+()会执行产生该类的类里面的:__call__



class MyMetaClass(type):
    def __call__(self, *args, **kwargs):
        # 1.产生一个空对象
        # 2.调用__init__给对象添加独有的数据
        # 3.返回创建好的对象
        if args:
            raise TypeError('传入对象独有的数据要按照关键字传参')
        return super().__call__(*args,**kwargs)

class Student(metaclass=MyMetaClass):
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

obj = Student(name='jason',age=18,gender = 'male')
print(obj.__dict__)   # {'name': 'jason', 'age': 18, 'gender': 'male'}

 

魔法方法__new__

 

__new__:可以产生一个空对象


class Myclass(type):
    def __call__(self, *args, **kwargs):
        obj = self.__new__(self)
        self.__init__(obj,*args, **kwargs)
        return obj

class Student(metaclass=Myclass):
    def __init__(self,name):
        self.name = name

obj = Student('tony')
print(obj.name)   # tony

 

 

设计模式之单例模式

1. IT行业里由23种设计模式
2. 单例模式:
    类加括号无论执行多少次永远只产生一个对象
3. 为什么要做单例?
    当类中有许多强大的方法,我们需要在程序中多个地方使用。不做单例就会浪费存储空间
    使用单例模式,整个程序就用一个对象

 

标签:__,name,self,魔法,及元类,面向对象,print,type,class
From: https://www.cnblogs.com/juzijunjun/p/16871033.html

相关文章

  • Python——面向对象(魔法方法、元类)
    Python——面向对象(魔法方法、元类)魔法方法'''魔法方法: 类中定义的双下方法都称为魔法方法 不需要人为调用在特定的条件下回自动触发运行 eg:__init__创建空......
  • 面向对象之魔法方法及元类
    昨日内容回顾类的派生的应用在需要对原有的方法进行个性化扩展时,需要应用到方法的派生。在进行派生时,需要先定位到需要派生的的功能,添加个性化的功能后,使用super调用......
  • 面向对象之魔法方法/元类
    面向对象的魔法方法classC1:name='张三丰'age=18def__init__(self,name):#对象添加数据或改变数据时自动触发print('__init__......
  • 面向对象的魔法方法、元类定制类与对象的产生行为
    今日内容回顾目录今日内容回顾面向对象的魔法方法魔法方法笔试题元类简介创键类的两种方式元类定制类的产生行为元类定制对象的产生行为魔法方法之双下new设计模式简介面......
  • 面向对象4
    今日内容详细面向对象面对对象的魔法方法魔法方法:类中定义的双下方法都称为魔法方法不需要人为调用在特定的条件下会自动触发运行eg:__init__创建空对象之后自动触......
  • 面向对象的魔法方法与元类
    面向对象的魔法方法与元类面向对象的魔法方法魔法方法就是在类中定义的双下方法,它不需要人为调用,在特定的条件下会自动触发运行1.__init__对象添加独有数据的时候会......
  • 元类、魔法方法(魔术方法)
    目录今日内容概要今日内容详细面向对象的魔法方法魔法方法笔试题元类简介创建类的两种方式元类定制类的产生行为元类定制对象的产生行为魔法方法之双下new设计模式简介作业......
  • 面向对象魔法方法及元类
    内容概要面向对象的魔法方法基于魔法方法的笔试题元类简介创建类的两种方式元类定制类的产生行为元类定制对象的产生行为魔法方法之双下new方法设......
  • 面向对象的魔法方法、魔法方法笔试题、元类简介、创建类的两种方式、元类定制类的产生
    面向对象的魔法方法魔法方法:类中定义的双下方法都称为魔法方法 不需要人为调用在特定的条件下回自动触发运行 eg:__init__创建空对象之后自动触发给对象添加独有的数......
  • 面向对象编程(四)
    面向对象编程(四)一、面向对象的魔法方法1.魔法方法简介在类中,有一些内置好的特定的方法,方法名是“__xx__”,在进行特定的操作时会被调用,这些方法被称为魔法方法,不需......