Python中的__new__、__init__、__call__三个特殊方法

new: 对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)
init : 对象的初始化, 是一个实例方法,第一个参数是self。
call : 对象可call,注意不是类,是对象。
先有创建,才有初始化。即先new,而后init
直接看代码:

 
class Bar(object): 
  pass

class Foo(object): 
  def __new__(cls, *args, **kwargs): 
    return Bar() 

print Foo()
 可以看到,输出来是一个Bar对象。
1
2
3
4
5
6
7
8
9

通俗一点就是,当你实例化一个对象的时候,就会执行new 方法里面的方法。new方法在类定义中不是必须写的,如果没定义,默认会调用object.new去创建一个对象。如果定义了,就是override,可以custom创建对象的行为。

class Person(object):
  """Silly Person"""

  def __init__(self, name, age):
    self.name = name
    self.age = age

  def __str__(self):
    return '<Person: %s(%s)>' % (self.name, self.age)

if __name__ == '__main__':
  piglei = Person('piglei', 24)
  print piglei
1
2
3
4
5
6
7
8
9
10
11
12
13

这样便是init最普通的用法了。但init其实不是实例化一个类的时候第一个被调用 的方法。当使用 Persion(name, age) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 new 方法。

call 这个看代码意会

#call.py 一个class被载入的情况下。
class Next:
  List = []

  def __init__(self,low,high) :
    for Num in range(low,high) :
      self.List.append(Num ** 2)

  def __call__(self,Nu):
    return self.List[Nu]
1
2
3
4
5
6
7
8
9
10

如果 这样使用:

b = Next(1,7)
print b.List
print b(2)
1
2
3
输出
[1, 4, 9, 16, 25, 36]
9
1
2
3

但如果这样使用:

b = Next
b(1,7)
print b.List
print b(2)
$python ./call.py
[1, 4, 9, 16, 25, 36]

Traceback (most recent call last):
 File "cal.py", line 17, in <module>
  print b(2) 
TypeError: __init__() takes exactly 3 arguments (2 given)
1
2
3
4
5
6
7
8
9
10
11

init是初始化函数,在生成类的实例时执行。
call是模拟()的调用,需要在实例上应用,因此这个实例自然是已经执行过init了。
你所举的后面那个例子:
b = Next
这并不是创建实例,而是将class赋给一个变量。因此后面使用b进行的操作都是对Next类的操作,那么其实就是:

Next(1,7)
print Next.List
print Next(2)

Pingbacks已打开。

Trackbacks

引用地址

评论
  1. Robertjig Robertjig 发布于 2020年11月30日 01:32 #

    <a href=https://videochatmix.com/>секс чат девушек москва</a>

  2. Elizrite Elizrite 发布于 2020年11月30日 01:55 #

    This article about porn https://pornoturedy.com contains sexually explicit content and language. The innovative blogging site was once one of the best places to find porn. With artful images, amateur sex bloggers.

  3. KimGal KimGal 发布于 2020年11月30日 02:01 #

    <a href="https://levitravarde.com/">levitra purchase usa</a>

  4. EvaGal EvaGal 发布于 2020年11月30日 02:49 #

    <a href="http://levitrast.com/">levitra 20 mg online</a>

  5. Quick Loans Quick Loans 发布于 2020年11月30日 03:08 #

    <a href="https://onlinelendingpd.com/">direct lenders bad credit</a> <a href="https://dukeloans.com/">loans with no credit check</a>

  6. state life insurance state life insurance 发布于 2020年11月30日 04:54 #

    <a href="https://gglifeinsurance.com/">life insurance for kids</a> <a href="https://wtlifeinsurance.com/">best life insurance policies</a>

  7. KimGal KimGal 发布于 2020年11月30日 05:09 #

    <a href="https://budesonide24.com/">budesonide 0.25</a>

  8. Bad Credit Bad Credit 发布于 2020年11月30日 05:26 #

    <a href="http://paydaymont.com/">paydayloans</a> <a href="http://ozcashadvance.com/">loan cash</a>

  9. RobertTab RobertTab 发布于 2020年11月30日 06:32 #

    <a href=https://gorefpnp.com/xc7x0x3s/> <b>!!! 100% Deposit Match up to $300 !!!</b></a>
    It is high time to start playing online real money slots without further ado. online casino slot strategy slot tips and tricks slots for free money slots o fun casino slot machine free app
    continuation here >>> <a href=https://cutt.us/UcVAg>https://cutt.us/UcVAg</a>
    Thanks to the study of ergonomics, comfortable cushioning and different chair adjustment mechanisms, we can offer your customers many comfortable hours of entertainment without making them feel tired or sit in a wrong way. Since then, this casino has a club of loyal and permanent gamblers that consider the platform the most favorite one and prefer it to the others. Funeral Slot Canyon is one of the most outstanding examples of lengthy towering conglomerate rock slot narrows in Death Valley. And now you can download the Garage slot machine on your computer or tablet with the Windows operating system. We stock a huge range and of all things slot cars, including cars, sets and performance parts. <a href=https://gamesforrealmoney.blogspot.com/> https://gamesforrealmoney.blogspot.com</a> <a href=https://slotmachinejackpots2020.blogspot.com/p/site-map.html> site</a>

  10. Andrewexcuh Andrewexcuh 发布于 2020年11月30日 08:27 #

    <a href=http://en.world-cam.ru/cams/united-states-web-cam-online/>Webcams USA online</a> Webcams USA online set on the main street of the South island Key West- Duval st. Florida, where the majority of first class hotels and popular restaurants, this long street runs directly to the pier.

发表评论