python Class:オブジェクト向けの高度なプログラミング_call__& callable()


公式サイトの説明:
3.4.5. Emulating callable objects
  • object. __call__ (self[, args...])
  • Called when the instance is “called” as a function; if this method is defined,  x(arg1, arg2, ...)  is a shorthand for  x.__call__(arg1,arg2, ...) .

  • 読めますが、読めません...硬伤ですね...
    この2,3日文を出すのはいつも审査されて、理解できなくて、私が廖某のフルネームを出して人が不快ではありませんか???
    よりよく理解するために、廖某の__を引用した.call__プログラムと自分の_repr__/__str__プログラムの比較:
    # :__call__            name
    class Student1(object):
        def __init__(self, name):
            self.name = name
    
        def __call__(self):
            print('My name is %s.' % self.name)    
    
    h = Student1('MumU')
    print 'liao:', h        
               
    # :__repr__ / __str__              name
    class Student2(object):
        def __init__(self, name):
            self.name = name
    
        def __str__(self):
            return 'Student2 name:%s'%self.name
        __repr__ = __str__        
        
    l = Student2('U')
    print 'me:', l

    実行結果:
    liao: <__main__.student1>
    me: Student2 name:U

    うん、どうしてStudent 1がこんな出力するの??
    もう一つの方法を変えます:プログラムClassはすべて変えていないで、ただ文を出力して変えました(マーク:#####)
    # :__call__            name
    class Student1(object):
        def __init__(self, name):
            self.name = name
    
        def __call__(self):
            print('My name is %s.' % self.name)    
    
    print Student1('MumU')   ####
               
    # :__repr__ / __str__              name
    class Student2(object):
        def __init__(self, name):
            self.name = name
    
        def __str__(self):
            return 'Student2 name:%s'%self.name
        __repr__ = __str__        
        
    print Student2('U')  ####

    実行結果:
    liao: <__main__.student1>
    me: Student2 name:U

    まあ、やっぱり、考えてみれば、この出力の書き方は前のものと等価だから...そこで私は、もし__call__自分の関数を呼び出すなら、関数を使えばいい..末尾に()?!
    再試行:廖の出力文のみ変更(マーク:####)
    # :__call__            name
    class Student1(object):
        def __init__(self, name):
            self.name = name
    
        def __call__(self):
            print('My name is %s.' % self.name)    
    
    print Student1('MumU')()   ####
               
    # :__repr__ / __str__              name
    class Student2(object):
        def __init__(self, name):
            self.name = name
    
        def __str__(self):
            return 'Student2 name:%s'%self.name
        __repr__ = __str__        
        
    print Student2('U')

    実行結果:
    liao: My name is MumU.
    None
    me: Student2 name:U

    叩きますか、本当に関数ですね...
    こんなにたくさん叩いても、隠しても普通だから、普通のものに変えればわかる.
    class Animal(object):
        def __init__(self, name):
            self.name = name
        
        def run(self):
            print '%s is running'%self.name
            
    dog = Animal('dog')
    print '     class   name :', dog.name
    print '     class   (  ) :', dog.run()

    実行結果:
         class   name : dog
         class   (  ) : dog is running
    None

    属性を表示するには()番号を付けないので、メソッド(関数)を使用する場合に必要です.
    なぜ運転の最後にNoneがあるのですか?
    Because,
    dog.run()はprintを1回実行しましたが、
        def run(self):
            print '%s is running'%self.name

    そして
    print '     class   (  ) :', dog.run()

    もう一度実行したので、このprintはNoneを出力するしかありません.
    私は本当に頭がいいですね.ハハハハ.
    callable:オブジェクトが呼び出せるかどうか、すなわち関数かどうかを表示します.
    print 'Student1    ??', callable(Student1('MumU'))       
    print 'Student2    ??', callable(Student2('U'))

    実行結果:
    Student1    ?? True
    Student2    ?? False