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__类属性
    
  • 相关阅读:
    JavaScript做定时器
    当前时间到固定日期的天数,如:在页面弹出显示到到2015年5月1日还有多少天
    使用Date日期对象来完成,在页面上根据不同时间显示不同的问候语,如:早上好,中午好,下午好,晚上好等信息
    JavaScript中遍历数组中元素的两种方法
    设计程序,单击【随机数】按钮,使用Math对象的random函数产生一个0-100之间(含0-100)的随机整数,并在对话框中显示,如下图。单击【计算】按钮,计算该随机数的平方、平方根和自然对数,保留两位小数,并在对话框中显示,如下图。
    JavaScript中实现四舍五入后保留小数的方法
    打印函数如何适应不同的打印机
    在MFC中改变控件的TAB顺序
    LPCTSTR —— 摘自百度百科
    vector使用注意事项
  • 原文地址:https://www.cnblogs.com/kai-/p/11959139.html
Copyright © 2011-2022 走看看