Python_类的调用的若干问题和__init__() should return None, not 'xxx'

首先看一段代码:

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 ,所以第二个返回为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 是在一个对象实例化的时候所调用的第一个方法
2. 它的第一个参数是这个类,其他的参数是用来直接传递给 init 方法
3. new 决定是否要使用该 init 方法,因为 new 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 new 没有返回实例对象,则 init 不会被调用
4. 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

你可能感兴趣的:(Python_类的调用的若干问题和__init__() should return None, not 'xxx')