zoukankan      html  css  js  c++  java
  • Python_020(几个经典内置方法)

    一.内置方法

    1.内置方法表示:__名字__

      几种名称: 1)双下方法 2)魔术方法 3)类中的特殊方法/内置方法

      类中的每一个双下方法都有它自己的特殊意义;所有的双下方法没有 需要你在外部直接调用的

      父类Object都带有这些方法,而总是有一些其他的 内置函数 特殊语法来触发双下方法

    2.__call__()方法:

    class A:
        def __call__(self, *args, **kwargs):
            print('对象()自动触发我!')
    a = A()
    a()         #这两个步骤还可以写为A()()

    1)__call__的一些用法,如果你有两个类,你只想显给别人B类,而不暴露A类,可能在实例化A类之前做一些事情

    这时候就需要引入另一个类,让它执行__call__方法

    class A:
        def __call__(self, *args, **kwargs):
            print('执行call方法了')
    class B:
        def __init__(self,cls):
            print('在实例化A之前做一些事情')
            self.a = cls()                    #实例化A的对象        
            self.a()                        #调用A类中的call方法
            print('在实例化A之后做一些事情')
    B(A)  #只暴露B,不暴露A

    2)__len__方法:

    a:遇到len(obj)会自动触发obj的__len__方法 

    class A:
        def __init__(self,obj):
            self.obj = obj
        def __len__(self):
            return len(self.obj)
    a = A('wwwwww')
    print(len(a))
    #结果为6

    3)__str__方法:

    a:会自动触发该方法的几种情况

       1)print一个对象相当于调用一个对象的__str__方法

       2)str(obj),相当于执行obj.__str__方法

       3)'%s' % obj相当于执行了obj.__str__方法

    b:如果类中没有__str__方法,会自动执行父类的Object的__str__方法,但是只会返回给你一个内存地址,因为它不知道你想要得到什么属性;

    class A:
        pass
    a = A()
    print(a)
    #输出结果:
    <__main__.A object at 0x0000024F722690F0>
    
    
    
    #类中含有__str__方法:
    class A:
        def __str__(self):
            return ('%s, %s, %s')% (self.name,self.age,self.cls)
        def __init__(self,name):
            self.name = name
            self.age = 15
            self.cls = 'python'
    a = A('zhou')
    print(a)
    b = A('liu')
    print(b)
    #输出结果
    zhou, 15, python
    liu, 15, python

    c:有什么用处,特别好用能不用你调用就自动输出一些你需要显示的内容;

    4)__new__方法:

    a:__new__和__init__的千丝万缕

    __new__:开辟内存空间,属于对象的,把对象的空间作为返回值传给self,执行init方法;  类的构造方法

    __init__:给对象封装属性;   类的初始化方法

    看他们的执行顺序:

    class A:
        def __new__(cls, *args, **kwargs):
            print('执行了__new__方法')
            return object.__new__(cls)
        def __init__(self):
            print('执行了__init__方法')
    a = A()
    #执行结果
    执行了__new__方法
    执行了__init__方法

    #所以__new__是在对象实例化之前调用的,还没有开辟空间传给self,所以这里会把cls类的空间传进来;

    new的金典题目单例类:

    单例类:在实例化对象后,每个对象的开辟的空间一样,就是单例类;

    class A:
        _NAME = None
        def __new__(cls, *args, **kwargs):
            if not cls._NAME:
                cls._NAME = object.__new__(cls)
            return cls._NAME
        def __init__(self):
            pass
    a = A()
    print(a)
    b = A()
    print(b)
    #输出结果
    <__main__.A object at 0x00000221704E9240>
    <__main__.A object at 0x00000221704E9240>
  • 相关阅读:
    实现一个电话号码生成器
    SQL查询--关于查询的练习题
    SQL查询--内连接、外连接、自连接查询
    SQL查询--约束
    SQL查询--索引
    SQL查询--简单了解SQL(结构化查询语言)
    使用python做一个爬虫GUI程序
    postman(十二):发送携带md5签名、随机数等参数的请求
    对比3种接口测试的工具:jmeter+ant;postman;python的requests+unittest或requests+excel
    (四十八)c#Winform自定义控件-下拉按钮-HZHControls
  • 原文地址:https://www.cnblogs.com/0627zhou/p/9416230.html
Copyright © 2011-2022 走看看