• python学习第23天


    1.1del 魔术方法

    触发时机:当对象被内存回收的时候自动触发[1.页面执行完毕回收所有变量 2.所有对象被del的时候]
    功能:对象使用完毕后资源回收
    参数:一个self接受对象
    返回值:无
    

    (1)页面执行完毕回收所有变量

    class LangDog():
       food = "吃肉"
       def __init__(self,name):
          self.name = name
          
       def __del__(self):
          print("析构方法被触发..")
    obj = LangDog("刀疤")
    print(obj.name)
    
    

    (2)所有对象都被del的时候

    当一个值,没有任何变量指向或者引用,这个值才会被真正的释放

    other_obj = obj
    print(other_obj is obj)
    print("<==start==>")
    #del obj
    #del other_obj   # 在中间打印析构方法被触发
    #print("<==end==>")
    

    (3)模拟文件操作

    # fp = open(文件,模式,编码)
    # fp.read()
    # fp.close()
    import os
    class ReadFile():
       def __new__(cls,filename):
          # 判断文件是否存在
          if os.path.exists(filename):
             return object.__new__(cls)
          else:
             return print("该文件是不存在的")
          
       def __init__(self,filename):
          # 打开文件操作
          self.fp = open(filename,mode="r",encoding="utf-8")
          
       def readcontent(self):    
          # 读取文件操作
          content = self.fp.read()
          return content
          
       def __del__(self):
          self.fp.close()
          
    
          
    obj = ReadFile("ceshi.txt")
    #res = obj.readcontent()
    #print(res)
    

    1.2 str 魔术方法

    触发时机: 使用print(对象)或者str(对象)的时候触发
    功能:     查看对象
    参数:     一个self接受当前对象
    返回值:   必须返回字符串类型
    
    class Cat():
       gift = "传说中的小猫有九条命,喜欢卖萌和上树"
       
       def __init__(self,name):
          self.name = name
          
       def __str__(self):
          return self.cat_info()
          
       def cat_info(self):
          return "{}小猫有故事-{}".format(self.name,self.gift)
    
    tom = Cat("汤姆")
    # 触发方式一, print 打印该对象
    # print(tom)
    # 触发方式二, str
    res = str(tom)
    print(res)
    

    1.3 repr 魔术方法

    触发时机: 使用repr(对象)的时候触发
    功能:     查看对象,与魔术方法__str__相似
    参数:     一个self接受当前对象
    返回值:   必须返回字符串类型
    
    class Mouse():
       gift = "打洞"
       
       def __init__(self,name):
          self.name = name
          
       def __repr__(self):
          return self.mouse_info()
          
       def mouse_info(self):
          return "{}老鼠天赋是{},龙生龙,凤生凤,老鼠的儿子会打洞".format(self.name,self.gift)
          
       # 在系统底层,如果定义了repr , 将会默认赋值给str方法.
       # __str__ = __repr__
          
    
    # repr强转obj对象时触发      
    obj = Mouse("杰瑞")
    res = repr(obj)
    print(res)
    
    # 注意点 底层存在赋值调用给str的语法,所以能实现打印或者str强转对象的触发机制.
    print(obj)
    res = str(obj)
    print(res)
    

    1.4 call 魔术方法

    触发时机:把对象当作函数调用的时候自动触发
    功能: 模拟函数化操作
    参数: 参数不固定,至少一个self参数
    返回值: 看需求
    

    (1)基本语法

    class MyClass():
       a = 1
       """"""
       def __call__(self):
          print("call魔术方法被触发..") 
    
    obj = MyClass()
    obj()
    

    (2)模拟洗衣服的过程

    class Wash():
    
       # 用call魔术方法统一调用
       def __call__(self,something):
          self.step1(something)
          self.step2()
          self.step3()
    
       def step1(self,something):
          print("脱衣服,洗{}".format(something))
          
       def step2(self):
          print("放水里,扔点洗衣液,洗衣粉,蓝月亮")
          
       def step3(self):
          print("扭干净,穿上")
    
    obj = Wash()
    obj("裤衩")
    

    (3)模拟内置方法 int 实现myint

    import math
    class MyInt():
    
       def mycalc(self,num,sign=1):
          # 去掉左边多余的0
          strvar = num.lstrip("0")
          if strvar == "":
             return 0
          # 计算最终的结果
          return eval(strvar) * sign
    
    
       def __call__(self,num):
       
          # 判断是布尔类型
          if isinstance(num,bool):
             if num == True:
                return 1
             else:
                return 0
          # 判断是整型
          elif isinstance(num,int):
             return num
          # 判断是浮点型
          elif isinstance(num,float):
             # 方法一
             '''
             strvar = str(num)        
             return strvar.split(".")[0]
             '''
             # 方法二
             """
             if num >= 0 :
                return math.floor(num)
             else:
                return math.ceil(num)
             """
             return math.floor(num) if num >= 0 else math.ceil(num)
             
          elif isinstance(num,str):
             # 首字符是+或者-  后边的是纯数字字符串
             if (num[0] == "+"  or  num[0] == "-") and num[1:].isdecimal():
                if num[0] == "+":
                   sign = 1
                else:
                   sign = -1
                return self.mycalc(num[1:],sign)
                
             elif num.isdecimal():
                return self.mycalc(num)
                
             else:
                return "老铁,这个真不能转~"
                   
          
    
    myint = MyInt()
    print(  myint(0)  ) #=> 3
    print(  myint(3.13)  ) #=> 3
    print(  myint("+00000000000000000001003")  ,"<==1=>")
    print(  myint("+abcd")  ,"<===>")
    print(  myint("-0000000000000000000.1003")  ,"<==2=>")
    print(  int("0000000000000000000003")  )
    print(  int("+0000000000000000000003")  )
    # print(  int("+-+-+-+-+-+-1233444")  )
    print(  myint("+-+-+-+-+-+-1233444")  )
    

    1.5 bool 魔术方法

    触发时机:使用bool(对象)的时候自动触发
    功能:强转对象
    参数:一个self接受当前对象
    返回值:必须是布尔类型
    
    类似的还有如下等等(了解):
       __complex__(self)      被complex强转对象时调用
       __int__(self)          被int强转对象时调用
       __float__(self)        被float强转对象时调用
       ...
       ...
    

    (1)基本语法

    class MyClass():
       def __bool__(self):
          return True
          
    obj = MyClass()
    res = bool(obj)
    print(res)
    

    1.6 add 魔术方法(一直相关的 radd 反向加法)

    触发时机:使用对象进行运算相加的时候自动触发
    功能:对象运算
    参数:二个对象参数
    返回值:运算后的值
    
    类似的还有如下等等(了解):
       __sub__(self, other)           定义减法的行为:-
       __mul__(self, other)           定义乘法的行为:
       __truediv__(self, other)       定义真除法的行为:/
       ...
       ...
    

    (1)基本语法

    class MyAdd():
       def __init__(self,num):
          self.num = num
    
       # 对象在加号+左侧的时,自动触发
       def __add__(self,other):
          return self.num + other
          
       def __radd__(self,other):
          return self.num + other*2
          
    # 情况一
    a = MyAdd(7)
    # self 接受a   other接受7 , 触发的是__add__方法
    # 情况二
    # res = a + 7
    # self 接受a   other接受7 , 触发的是__radd__方法
    # res = 7 + a
    # print(res)
    # 情况三
    """
    a+b 先触发 __add__  ,self 接受的7 , other 接受的是b
    res = 7+b
    
    7+b 再触发 __radd__ ,self 接受的b , other 接受的是7
    return  8+7*2 = 22
    res = 22
    
    """
    b = MyAdd(8)
    res = a+b
    print(res,"<111222>")
    

    1.7 len 魔术方法

    触发时机:使用len(对象)的时候自动触发 
    功能:用于检测对象中或者类中成员的个数
    参数:一个self接受当前对象
    返回值:必须返回整型
    
    类似的还有如下等等(了解):
       __iter__(self)                 定义迭代容器中的元素的行为
       __reversed__(self)             定义当被 reversed() 调用时的行为
       __contains__(self, item)       定义当使用成员测试运算符(in 或 not in)时的行为
       ...
       ...
    

    (1)计算一下类中所有自定义成员的个数

    class MyClass():
       pty1 = 1
       pty2 = 2
       __pty3 = 3
       
       def func1():
          pass
          
       def func2():
          pass
       def __func3():
          pass
       
       def func4():
          pass
          
       def __len__(self):
          # print(MyClass.__dict__)
          # lst = []
          # for i in MyClass.__dict__:
             # print(i)
             # if not(  i.startswith("__") and i.endswith("__")  ):
                # lst.append(i)
                
          # print(lst)   
          
          # 简写
          lst = [i for i in MyClass.__dict__ if not(  i.startswith("__") and i.endswith("__")  )]
          return len(lst)
          
    obj = MyClass()
    print(   len(obj)  )
    

    1.7 与类相关的魔术属性

    class Man():
       pass
    
    class Woman():
       pass
    
    class Children(Man,Woman):
    
       """
       成员属性: eye 
       成员方法: skylight moonread __makebaby
       完成的功能: 描述小孩天生神力.
       """
    
       eye = "血轮眼"
       
       def skylight(self):
          print("一下生,直接使用天照,让世界变得混乱")
          
       def moonread(self,func):
          print("一下生,使出了武功绝学,月读,世界都黑暗里~")
          print(func.__name__ , type(  func.__name__  )) # earth_boom
       
       def __makebaby(self):
          print("这一手招数,只能我自己用")
    
    obj = Children()
    

    (1) dict 获取对象或类的内部成员结构

    print(obj.__dict__)
    print(Children.__dict__)
    {}
    {'__module__': '__main__', '__doc__': '
    	成员属性: eye 
    	成员方法: skylight moonread __makebaby
    	完成的功能: 描述小孩天生神力.
    	', 'eye': '血轮眼', 'skylight': <function Children.skylight at 0x00000139CE28D8C8>, 'moonread': <function Children.moonread at 0x00000139CE28D950>, '_Children__makebaby': <function Children.__makebaby at 0x00000139CE28D9D8>}
    
    

    (2) doc 获取对象或类的内部文档

    print(obj.__doc__)
    print(Children.__doc__)
    	成员属性: eye 
    	成员方法: skylight moonread __makebaby
    	完成的功能: 描述小孩天生神力.
    	
    

    (3) name 获取类名,函数名

    def earth_boom():
       print("使出一招地爆天星")
    obj.moonread(earth_boom)
    obj.moonread(Children)
    一下生,使出了武功绝学,月读,世界都黑暗里~
    earth_boom <class 'str'>
    一下生,使出了武功绝学,月读,世界都黑暗里~
    Children <class 'str'>
    

    (4) class 获取当前对象所属的类

    print(obj.__class__)
    <class '__main__.Children'>
    

    (5) bases 获取一个类直接继承的所有父类,返回元组

    print(Children.__bases__) # (<class '__main__.Man'>, <class '__main__.Woman'>)
    
  • 相关阅读:
    [转]C# winform窗体(cs文件) .Designer.cs、.resx 文件分离出来 同级问题
    [转]C# winform窗体(cs文件) .Designer.cs、.resx 文件分离出来 同级问题
    C#中SqlDataAdapter的使用小结
    C#中SqlDataAdapter的使用小结
    C#如何以TEXTBOX控件中输入的内容查找数据库其他内容
    C#如何以TEXTBOX控件中输入的内容查找数据库其他内容
    Dock Fill
    Dock Fill
    C# winform 读取数据库并显示成datagrid
    C# winform 读取数据库并显示成datagrid
  • 原文地址:https://www.cnblogs.com/yunchao-520/p/12990049.html
Copyright © 2020-2023  润新知