本文介绍了类属性与具有缺省值的实例变量的差异的处理方法,对大家解决问题具有一定的参考价值
问题描述
- 类变量和具有默认值的实例变量有什么区别吗?
(尤其是在"正常使用"下的行为,在内部我认为它们很可能是以不同的方式实现的)
- 我应该在什么上下文中使用哪个版本?
以这两个类为例:
class A:
d = 4
class A:
def __init__(self, d=4):
self.d = d
无论您选择哪个版本,当您运行下面的代码时,都会得到相同的结果:
a2 = A()
a = A()
print(a.d)
a.d = 2
print(a.d)
print(a2.d)
我是在读了
后想到这个问题的。
- class attribute behavior
推荐答案
类变量和具有默认值的实例变量有什么区别吗?
嗯,显然是的:一个类属性(不是"变量")属于类,一个实例属性属于实例。
我应该在什么上下文中使用哪个版本?
如果希望属性由类的所有实例共享,则使用类属性;如果希望属性特定于该实例,则使用实例属性。实际上,您很少需要类属性。
请注意,如果同时为类和实例定义相同的属性,则实例上的属性将隐藏类的属性。
nb:以上是一个非常粗略的简化,但我需要解释整个Python对象模型,这值得一本完整的书
以这两个类为例(...)无论您选择哪个版本,当您运行下面的代码时,您都会得到相同的结果
是的,这是这段代码的预期结果。
对于a
:
在第一种情况下,当您第一次打印
a.d
时,
a
没有实例属性
d
,因此您将获得class属性值。然后,通过为其赋值来创建实例属性
a.d
,从那时起,它将隐藏类属性。
在第二种情况下,
a.d
最初具有其缺省值,然后将其重新绑定到另一个值...很普通的东西。
对于a2
:
在第一种情况下,a2.a
将始终为4
,因为您尚未使用实例属性对其进行跟踪,因此它将从类中获取值。
在第二种情况下,它将始终是4
,因为您没有重新绑定实例属性,因此它仍然是默认值。
现在尝试将列表用作属性,并将其追加到列表,而不是重新绑定它:
class A:
d = []
class B:
def __init__(self):
self.d = []
def test(cls):
print("test {}".format(cls.__name__))
a = cls()
print(a.d)
a.d.append(2)
print(a.d)
a2 = cls()
print(a2.d)
if __name__ == "__main__":
test(A)
test(B)
最后要注意的是:您可能已经看到(或者有一天您可能会看到)使用类属性作为实例的默认值的代码--或者您可能会自己尝试这样做(因此提到了实例属性的‘默认’值)--如您的第一个示例所示。
这是不好的做法。这充其量是令人困惑的,如果属性是可变类型,则可能导致错误的行为。
这篇关于类属性与具有缺省值的实例变量的差异的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,WP2
do_action( "admin_action_{$_REQUEST[‘action’]}" )动作钩子::在发送“Action”请求变量时激发。Action Hook: Fires when an ‘action’ request variable is sent.目录锚点:#说明#源码说明(Description)钩子名称的动态部分$_REQUEST['action']引用从GET或POST请求派生的操作。源码(Source)更新版本源码位置使用被使用2.6.0 wp-admin/admin.php:...
日期:2020-09-02 17:44:16
浏览:1127
do_action( "admin_footer-{$GLOBALS[‘hook_suffix’]}", string $hook_suffix )操作挂钩:在默认页脚脚本之后打印脚本或数据。Action Hook: Print scripts or data after the default footer scripts.目录锚点:#说明#参数#源码说明(Description)钩子名的动态部分,$GLOBALS['hook_suffix']引用当前页的全局钩子后缀。参数(Parameters)参数类...
日期:2020-09-02 17:44:20
浏览:1033
do_action( "customize_save_{$this->id_data[‘base’]}", WP_Customize_Setting $this )动作钩子::在调用WP_Customize_Setting::save()方法时激发。Action Hook: Fires when the WP_Customize_Setting::save() method is called.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分,$this->id_data...
日期:2020-08-15 15:47:24
浏览:775
apply_filters( "customize_value_{$this->id_data[‘base’]}", mixed $default )过滤器::过滤未作为主题模式或选项处理的自定义设置值。Filter Hook: Filter a Customize setting value not handled as a theme_mod or option.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分,$this->id_date['base'],指的是设置...
日期:2020-08-15 15:47:24
浏览:866
过滤钩子:过滤评论作者的URL。Filter Hook: Filters the comment author’s URL.目录锚点:#源码源码(Source)更新版本源码位置使用被使用 wp-includes/comment-template.php:32610...
日期:2020-08-10 23:06:14
浏览:903
do_action( "network_admin_edit_{$_GET[‘action’]}" )操作挂钩:启动请求的处理程序操作。Action Hook: Fires the requested handler action.目录锚点:#说明#源码说明(Description)钩子名称的动态部分$u GET['action']引用请求的操作的名称。源码(Source)更新版本源码位置使用被使用3.1.0 wp-admin/network/edit.php:3600...
日期:2020-08-02 09:56:09
浏览:848
apply_filters( "network_sites_updated_message_{$_GET[‘updated’]}", string $msg )筛选器挂钩:在网络管理中筛选特定的非默认站点更新消息。Filter Hook: Filters a specific, non-default site-updated message in the Network admin.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分$_GET['updated']引用了非默认的...
日期:2020-08-02 09:56:03
浏览:834
过滤器::过滤在访问数据库之前是否初始化站点的检查。Filter Hook: Filters the check for whether a site is initialized before the database is accessed.目录锚点:#源码源码(Source)更新版本源码位置使用被使用 wp-includes/ms-site.php:93910...
日期:2020-07-29 10:15:38
浏览:809
你想在WordPress 中添加关键字和meta 描述吗?关键字和meta 描述使你能够提高网站的SEO。在本文中,我们将向你展示如何在WordPress 中正确添加关键字和meta 描述。为什么要在WordPress 中添加关键字和Meta 描述?关键字和说明让搜寻引擎更了解您的帖子和页面的内容。关键词是人们寻找您发布的内容时,可能会搜索的重要词语或片语。而Meta Description则是对你的页面和文章的简要描述。如果你想要了解更多关于中继标签的资讯,可以参考Google的说明。Meta 关键字和描...
日期:2020-10-03 21:18:25
浏览:1620
SEO (Search Engine Optimization)中文是搜寻引擎最佳化,意思近于「关键字自然排序」、「网站排名优化」。简言之,SEO是以搜索引擎(如Google、Bing)为曝光媒体的行销手法。例如搜寻「wordpress教学」,会看到本站的「WordPress教学:12个课程…」排行Google第一:关键字:wordpress教学、wordpress课程…若搜寻「网站架设」,则会看到另一个网页排名第1:关键字:网站架设、架站…以上两个网页,每月从搜寻引擎导入自然流量,达2万4千:每月「有机搜...
日期:2020-10-30 17:23:57
浏览:1264