Python_020(几个经典内置方法),,一.内置方法1.内置


一.内置方法

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:    passa = 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, pythonliu, 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):        passa = A()print(a)b = A()print(b)#输出结果<__main__.A object at 0x00000221704E9240><__main__.A object at 0x00000221704E9240>

Python_020(几个经典内置方法)

评论关闭