zoukankan      html  css  js  c++  java
  • 类的内置方法(魔法方法)

    类的内置方法(魔法方法)

    目录

    什么是魔法方法?

    凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法

    类的内置方法,会在某种条件满足下自动触发。

    __new__:在__init__出发前,自动触发,调用该类时,内部会通过__new__产生一个新的对象。

    __init__:在调用前触发,通过产生的对象自动调用__init__()

        # 条件: __new__: 在__init__触发前,自动触发。
        def __new__(cls, *args, **kwargs):
            print('此处是__new__方法的执行')
            # python内部通过object调用内部的__new__实现产生一个空的对象  ---> 内存地址
            return object.__new__(cls, *args, **kwargs)
    
        # 条件: __init__: 在调用类时自动触发。
        def __init__(self):
            print('此处是__init__方法的执行')
    
    

    __getattr__: 在 “对象.属性” 获取属性时,若 “属性没有” 时触发,可以很方便地动态返回一个属性;

    class Foo:
        def __getattr__(self, item):
            return '666'
    f = Foo()
    print(f.x)
    
    当调用不存在的属性时调用
    

    __getattribute__: 在 “对象.属性” 获取属性时,无论 "属性有没有" 都会触发。

    注意: 只要__getattr____getattribute__ 同时存在类的内部,只会触发__getattribute__

    __setattr__: 当 “对象.属性 = 属性值” , 添加或修改属性时触发

    __call__在调用对象 “对象 + ()” 时触发。

    class Foo:
        def __call__(self, *args, **kwargs):
            print(123)
    f = Foo()
    f() #如果不写上面的__call__方法,就不会调用。如果加上,就正确了
    Foo()() #也可以这样表示
    
    

    __str__因为在python中调用print()打印实例化对象时会调用__str__()如果__str__()中有返回值,就会打印其中的返回值。

    # 条件: 在打印对象时触发。
        # 注意: 该方法必须要有一个 “字符串” 返回值。
        # def __str__(self):
        #     print('此处是__str__方法的执行')
        #     return '111'
    class ss:
        def __init__(self,age,name):
            self.age = age
            self.name = name
        def __str__(self):
            return str(self.age)+",wozenmezhemeshuai,,"+self.name
    if __name__=="__main__":
        s = ss(21,'leitin')
        print(s)
    #21,wozenmezhemeshuai,,leitin
    不知道大家再写程序时,打印一个实例化对象时,打印的其实时一个对象的地址。而通过__str__()函数就可以帮助我们打印对象中具体的属性值,或者你想得到的东西。
    因为在python中调用print()打印实例化对象时会调用__str__()如果__str__()中有返回值,就会打印其中的返回值。
    
    # 在对象通过 “对象[key]” 获取属性时触发。
        # def __getitem__(self, item):
        #     print('此处是__getitem__方法的执行')
        #     print(item)
        #     return self.__dict__[item]
        
    def __getitem__(self, item):  #得到   
        return 123
    f = Foo()
    print(f['qqq'])  #不管里面放的啥值,它都会得到返回值的内容,调用的是__getitem__方法
    #结果
    123
    

    __class__

    1.__class__属性

    实例调用__class__属性时会指向该实例对应的类

    然后可以再去调用其它类属性,类属性由类调用

    class Test:
        
        def start_requests(self):
            cls = self.__class__
            print(cls)
    
    run = Test()
    print(run.__class__().start_requests())
    
    self.__classs__.__name__             
    //首先用self.__class__将实例变量指向类,然后再去调用__name__类属性
    
  • 相关阅读:
    NYOJ 38布线问题
    NYOJ 106背包问题
    基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题
    HDOJ 2546饭卡(01背包问题)
    FBI树-数据结构(二叉树)
    二叉树遍历(flist)(二叉树,已知中序层序,求先序)
    求先序排列(二叉树已知中序和后序,求先序)
    滑雪(dp)
    Python——plot可视化数据,作业8(python programming)
    数据库SQL语言学习----左外连接,右外连接,外连接,自然连接的形象对比
  • 原文地址:https://www.cnblogs.com/kai-/p/11959139.html
Copyright © 2011-2022 走看看