python类中方法的执行顺序-python 函数或者类 代码的执行顺序

修改了一下问题,大家直接先看例 3

对于简单的控制语句来说,

x = 1

if x > 0:

print('true')

else:

print('false')

我们都知道当判定 x > 0时,else的语句是不会执行的,

python 属于解释型语言,对于函数来讲,例1

# filename test.py

def test1():

pass

# test1()

下面是我不知道正确与否的理解:

1,对于java而言,如果没有对于 test1() 这一行代码执行对函数 test1 的调用的话,那就整个程序基本上没有意义,不会有内存分配,也不会有执行

2,但是对于 python 而言,会创建 test1 函数对象,然后保存 test1 中的一系列操作,这些操作不会被执行,即使整个程序没有对 test1 有任何的调用操作,但是只要程序没有结束,那么 test1 就会一直存在于内存中。

至于原因,是函数 test1 在程序运行后,会成为当前模块对象,即 module __main__的属性。

3,而对于 "test1’ 这个函数名而言,他引用了这个函数对象,所以就算没有调用该函数,垃圾回收机制不会将其回收

嵌套函数 例2

# filename test.py

def test1():

def test2():

pass

# return test2()

# test1()

对于例 1,我的理解有错误吗?

对比例 2 中 test1 的内层函数 test2 的情况是怎么样的,有调用和没有调用的情况会有什么不同吗?

之前问题可能描述的不太清楚,这儿再举一个例子 3

>>> class A(object):

a = []

def test1(self):

pass

@classmethod

def test2(cls):

print('cls.a', sys.getrefcount(cls.a))

print('cls.test1:', sys.getrefcount(cls.test1))

>>> A.test2()

('cls.a', 2)

('cls.test1:', 1)

上面的输出这个 2 可以理解,但是为什么另一个是 1 呢?

>>> def test3():

def test4():

pass

>>> sys.getrefcount(test3)

2

>>> dir(test3)

['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']

# sys.getrefcount(test4) NameError: name 'test4' is not defined

现在的问题是 test3 中的内层函数 test4 在内存中吗?如果在的话,在哪儿?(我觉得是应该在内存中的)如果没在的话,为什么没有 test4? 如果没有 test4 的话,修改一下上面的代码又该怎么看 ?

def test3():

def test4():

pass

return test4 # return test4()

刚刚修改了问题的时候,突然想到对于编程来讲可能没什么实际意义,大家可能都会知道怎么去定义使用内层函数。但我还是希望有人能解答我的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值