python中的内方法


1.创建类时先执行type的__init__方法,2.当一个类实例化时(创建一个对象)执行type的__call__方法,__call__方法的返回值就是实例化的对象    __call__内部调用      -类.__new__方法,创建一个对象      -类.__init__方法,初始化对象
实例化对象是谁取决于__new__方法,__new__返回什么就是什么

 __new__() 方法的特性:
  • __new__() 方法是在类准备将自身实例化时调用。
  • __new__() 方法始终都是类的静态方法,即使没有被加上静态方法装饰器
 

class Foo(object):
    pass

obj=Foo()  #默认是调用该类的直接父类的__new__()方法来构造该类的实例
print(obj) #打印结果:<__main__.Foo object at 0x000002636FEAA208>
事实上如果(新式)类中没有重写__new__()方法,即在定义新式类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。

class F1(object):  #重写__new__方法,返回这个重写的__new__方法
    def __new__(cls, *args, **kwargs):
        return 123

obj=F1() #实例化对象是谁取决于__new__方法,__new__返回什么就是什么
print(obj,type(obj))  #打印结果:123 <class ‘int‘>

class F2(object):
    pass

class F3(object):
    def __new__(cls, *args, **kwargs):
        return F2()

obj=F3()    #实例化对象是谁取决于__new__方法,__new__返回什么就是什么
print(obj)  #<__main__.F2 object at 0x00000210119BA4A8>
  • 如果要得到当前类的实例,应当在当前类中的 __new__() 方法语句中调用当前类的父类的 __new__() 方法。
  • 例如,如果当前类是直接继承自 object,那当前类的 __new__() 方法返回的对象应该为:
  • def __new__(cls, *args, **kwargs):
        ...
        return object.__new__(cls)
    • __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
    • __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
    • __init__有一个参数self,就是这个__new__返回的实例,__init____new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

原文地址:https://www.cnblogs.com/xingkongzhizhu/p/12003029.html

时间: 2024-10-19 17:12:45

python中的内方法的相关文章

Python中的__new__()方法与实例化

@Python中的__new__()方法与实例化 __new__()是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在Python 中 存在于类里面的构造方法__init__()负责将类的实例化,而在__init__()启动之前,__new__()决定是否 要使用该__init__()方法,因为__new__()可以调用其他类的构造方法或者直接返回别的对象来作为本类 的实例. 如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受

python中的内置函数getattr()

在python的官方文档中:getattr()的解释如下: getattr(object, name[, default]) Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object’s attributes, the result is the value of that attribute. For examp

Python中字典get方法的使用

Python中字典get方法的使用 说起来,这个功能是否需要学习还真是有待于讨论.其实,知道了字典这种数据结构以后,通过最基本的Python功能也能够实现一个类似的功能.不过,既然内置了这个功能那么我们就没有必要重复造车轮. 在字典内置的方法中,想说的方法为get.这个方法是通过键来获取相应的值,但是如果相应的键不存在则返回None.其实,None只是一个默认的返回值但是并不是一个不能修改的返回值.其实,如果查询失败,我们可以指定一个返回值. 上面提到的所有功能汇总在一个示范代码,具体如下: #

Python中的sort()方法的使用

本文和大家分享的主要是python中的sort()方法相关知识,一起来看看吧,希望对大家学习python有所帮助. 一.基本形式 sorted(iterable[, cmp[, key[, reverse]]]) iterable.sort(cmp[, key[, reverse]]) 参数解释: (1)iterable指定要排序的list或者iterable,不用多说: (2)cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数,如: students为类对象的list

关于python中的特殊方法

研究了几个小时,大概对python中的特殊方法一知半解,现在写写自己的理解,以及记录一些找到的资源.待自己有比较深入理解的时候,再来更新 https://docs.python.org/3/reference/datamodel.html#special-method-names 有一篇文章是要必须推荐给读者阅读的:Python Attributes and Methods(http://www.cafepy.com/article/python_attributes_and_methods/p

python中http请求方法有哪些

在python开发(http://www.maiziedu.com/course/python-px/)中,我们一般通过get.post方式发送http请求,可是最近在使用python做接口测试,发现python中http请求方法有许多种,作者整理了一番,把python中http请求方法都总结了出来,分享给大家,具体内容如下所示:一.python自带库----urllib2python自带库urllib2使用的比较多,简单使用如下:import urllib2response = urllib2

Python中格式化format()方法详解

Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参数使用{NUM}进行表示,0, 表示第一个参数,1, 表示第二个参数, 以后顺次递加; 使用":", 指定代表元素需要的操作, 如":.3"小数点三位, ":8"占8个字符空间等; 还可以添加特定的字母, 如: 'b' - 二进制. 将数字以2为基数

Python中的内置函数__init__()的理解

有点意思,本来我是学习java的.总所周知,java也有构造函数,而python在面向对象的概念中,也有构造函数.它就是 __init__(self) 方法. 其实类似于__init__()这种方法,其实还有很多.类似__del__(self)  ...  __new__(cls,*args,**kwd) 等等.它们被成为 python的常用内置方法. 下面开始介绍一下我对 __init__()的理解: class A(object): def __init__(self,name):  sel

Python中的__new__()方法的使用

__new__() 函数只能用于从object继承的新式类. 先看下object类中对__new__()方法的定义: class object:   @staticmethod # known case of __new__   def __new__(cls, *more): # known special case of object.__new__     """ T.__new__(S, ...) -> a new object with type S, a s