|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
__init__(self,...) 对实例化类对象进行初始化,可以带若干参数。该函数没有返回值,或者说返回 None ,而不能返回数值或字符串等。
__new__(cls) 一个类实例化是最先引用的函数。
图1:小甲鱼演示的例子
图1是小甲鱼在 41讲——构造与析构 章节 演示时候的例子。里面string的变量太多,搞的有点乱,然后自己又简单理了一下。
实际效果应该如下:
=======================================================================
class Capstr1(str):
def __new__(cll,string1):
string2 = string1.upper()
return str.__new__(cll,string2)
a = Capstr1('i love fish1')
class Capstr2(str):
def __new__(cll,string1):
return str.__new__(cll,string1.upper())
b = Capstr2('i love fish2')
class Capstr3(str):
def __new__(cll,string1):
return super(Capstr3,cll).__new__(cll,string1.upper())
c = Capstr3('i love fish3')
print(a)
print(b)
print(c)
======================================================================
其中的cll是 __new__ 方法中的一个参数,并且是第一个参数,是当前正在实例化的类,可以改为其他名字,但是在定义类的时候,用到的时候始终要保持一致。string1是最后进行实例化的时候,Capstr1('i love fish1'),这里面传入的参数——也就是这个字符串 'i love fish1' 。
然后对string1进行大写操作,并把结果赋给string2,最后调用父类str的__new__方法,返回参数为string2的实例化的类对象。简洁写法如第二种!第三种写法中的super()方法暂时不知道什么意思和作用。这是模仿网站上别人的写法写的。最后效果是一样的。所以暂时写在这。
下面参照 http://www.jb51.net/article/85724.htm 摘抄如下:
__new__ 方法是什么?
如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参 数则是生产所需原料,__init__()方法会按照方法中的语句负责将原料加工成实例以供工厂出货。而 __new__()则是生产部经理,__new__()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出 货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品。
__new__()方法的特性:
1.__new__()方法是在类准备将自身实例化时调用。
2.__new__()方法始终都是类的静态方法,即使没有被加上静态方法装饰器。
类的实例化和它的构造方法通常都是这个样子:
=======================================================================
class MyClass(object):
def __init__(self, *args, **kwargs):
...
# 实例化
myclass = MyClass(*args, **kwargs)
=======================================================================
(里面的*args 和**kwargs参数,可以到网络上搜一下,很多解释。主要在于* 和**,这里附一个相应的链接: https://www.cnblogs.com/xuyuanyuan123/p/6674645.html)
正如以上所示,一个类可以有多个位置参数和多个命名参数,而在实例化开始之后,在调用 __init__()方法之前,Python首先调用__new__()方法:
=======================================================================
def __new__(cls, *args, **kwargs):
...
=======================================================================
第一个参数cls是当前正在实例化的类。
如果要得到当前类的实例,应当在当前类中的__new__()方法语句中调用当前类的父类的__new__()方法。
例如,如果当前类是直接继承自object,那当前类的__new__()方法返回的对象应该为:
=======================================================================
def __new__(cls, *args, **kwargs):
...
return object.__new__(cls)
=======================================================================
注意:事实上如果(新式)类中没有重写__new__()方法,即在定义新式类时没有重新定义__new__()时 ,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写 __new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。
__new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法。 |
|