python修改属性默认值_python3 类中 怎么将方法的默认参数设置为属性?

这里搞不懂说明你对Python代码的执行理解得不够。在Python中,我们可以粗略的将一段代码被执行的时间分为“import time”和“run time”。

在import time被执行的代码,顾名思义,大多数情况是在被import时执行的代码,实际上并不一定非在被import时被执行。之所以我们这样称呼它,是因为在这个时间被执行的代码通常都是类和函数的定义,而这样的代码通常都写在单独的模块中,供我们import使用。以下我不在强调非import情况下的执行。当我们import某个模块时,该文件中处于模块作用域的语句会被执行,类和函数的定义也会被执行,解释器会创建对应的类对象和函数对象。在创建类对象时,类的主体部分中的语句会被执行(也就是非函数定义部分),类语句块中定义的函数作为类的方法绑定到类对象上。在创建函数对象时,解释器编译函数的主体,但不会执行其中的代码,直到我们调用它。

那么什么时候是run time呢?前面说的仅仅是在我们执行了import语句之后解释器就自动进行了这么多的操作。创建好类对象和函数对象,执行环境被搭建起来之后,我们就进入了runtime。当我们实例化一个类或者调用一个函数时,自然会返回一个结果。这时我们将这些被执行的语句称为在run time 被执行的。因为只有经过了import time,执行环境被搭建起来,有了我们需要的类对象和函数对象之后,我们才能实例化和调用函数,才能真正的“run”我们的代码。

之所以说这样区分是很粗略的,是因为当我们实际执行一个文件时,我们很有可能在执行一段时间之后再去import一个模块,然后使用它。python是一门动态语言,在这方面拘束很少,因此没必要严格的区分。

我们再来看你的问题,为什么会报错呢?因为你在定义sets方法的关键字参数中使用了self。self是什么,是实例。那么set方法的定义是什么时候被执行的呢?是在定义类对象时,在import time。这时候,哪来的self?所以想解决这个问题,一是可以将name和content写成类属性,把self去了,不过这样的话,所有的实例就只能共享一个name和content。一是只能将其写成默认值为None的关键字参数,然后在方法中进行检查。

这方面的知识可以阅读《Fluent Python》Chapter21 Class Metaprogramming。

Ps:类的命名习惯上首字母大写.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值