Python_クラスの呼び出しに関するいくつかの問題と_init__() should return None, not 'xxx'

1813 ワード

まずコードを見てみましょう.
class hello():
    def go():
        a='66'
        print(a)
def go_1():
    hello.go()
print(go_1)


go_を直接印刷すると1関数は、この関数のメモリアドレスを印刷します.これは明らかに私たちが望んでいるprint(go_1())出力に変更したわけではありません.66 None分析:pythonはhelloを先に呼び出しました.go()関数は「66」を印刷し、go_を印刷します.1()ただしprintもreturnもないので、2番目はnoneに戻ります.
test_2
class hello():
    def go():
        return 5
def go_1():
    hello.go()   
print(go_1())
None

このように書くとnoneも返されますgo()には戻り値がありますがgo_1()ではreturnがhelloから受け入れる.go()の戻り値.このnoneはgo_1()関数によって返されるものは、次のように変更されます.
class hello():
    def go():
        return 5
def go_1():
    return hello.go()   
print(go_1())

通常は5を返します
test_3:
class hello():
    def __init__(self):
            return 5
def go_1():
    return hello()
print(go_1())
TypeError: __init__() should return None, not 'int'

学习の中でこの间违いを报告して长い间私を困らせて、调べて発见します:_init__は、戻り値を取得できません.その下の戻り値を取得するには、次の方法を使用します.
class hello():
    def __new__(self):
            return 5
def go_1():
    return hello()
print(go_1())

newを使用すると正常に戻り値が得られます
5

拡張:1.newは、1つのオブジェクトがインスタンス化されるときに呼び出される最初の方法2である.その最初のパラメータはこのクラスであり、他のパラメータはinitメソッド3に直接伝達するために使用される.newは、他のクラスの構築方法を呼び出すか、または本クラスのインスタンスとして他のインスタンスオブジェクトを直接返すことができるため、initメソッドを使用するかどうかを決定する.newがインスタンスオブジェクトを返さない場合、initは呼び出されない.Newは主にtupleやstringなどの可変タイプを継承するために使用されます
まとめ:1 print(関数):メモリアドレス2 print(関数()を返す:関数値3を返すクラスメソッドの下の戻り値を得るnew定義4二次関数呼び出しクラスメソッドを変更するにはreturnクラスメソッドが必要
ヘルプ記事:https://www.jianshu.com/p/695384e5d8fa https://www.cnblogs.com/kaishirenshi/p/8617380.html