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>

猜你喜欢

转载自www.cnblogs.com/0627zhou/p/9416230.html