Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >理解__init_subclass__

理解__init_subclass__
EN

Stack Overflow用户
提问于 2017-07-30 05:25:33
回答 5查看 56.6K关注 0票数 106

我最终升级了python版本,并发现了添加的新特性。除其他外,我在新的__init_subclass__方法上绞尽脑汁。从医生那里:

每当包含类被子类调用时,都会调用此方法。然后cls是新的子类。如果定义为普通实例方法,则此方法将隐式转换为类方法。

因此,我开始使用它,遵循文档中的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Philosopher:
    def __init_subclass__(cls, default_name, **kwargs):
        super().__init_subclass__(**kwargs)
        print(f"Called __init_subclass({cls}, {default_name})")
        cls.default_name = default_name

class AustralianPhilosopher(Philosopher, default_name="Bruce"):
    pass

class GermanPhilosopher(Philosopher, default_name="Nietzsche"):
    default_name = "Hegel"
    print("Set name to Hegel")

Bruce = AustralianPhilosopher()
Mistery = GermanPhilosopher()
print(Bruce.default_name)
print(Mistery.default_name)

产生这个输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Called __init_subclass(<class '__main__.AustralianPhilosopher'>, 'Bruce')
'Set name to Hegel'
Called __init_subclass(<class '__main__.GermanPhilosopher'>, 'Nietzsche')
'Bruce'
'Nietzsche'

我知道这个方法是在子类定义之后调用的,但是我的问题是关于这个特性的用法。我也读过佩普487的文章,但对我没有多大帮助。这种方法有什么用呢?是为了:

  • 在创建时注册子类的超类?
  • 强制子类在定义时设置字段?

另外,我是否需要了解__set_name__才能完全理解它的用法?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-07-30 05:36:09

__init_subclass____set_name__是正交的机制--它们不是相互联系的,只是在相同的PEP中描述。这两种特性都需要一个功能齐全的元类。PEP 487涉及两种最常见的元类用途:

  • 如何让父类知道它何时被子类(__init_subclass__)
  • 如何让描述符类知道它所使用的属性的名称(__set_name__)

正如佩普487所说:

虽然使用元类有许多可能的方法,但绝大多数用例只分为三类:类创建后运行的初始化代码、描述符的初始化以及保持类属性定义的顺序。 通过在类创建中使用简单的钩子,可以很容易地实现前两个类别:

  • 初始化给定类的所有子类的__init_subclass__钩子。
  • 在创建类时,将对类中定义的所有属性(描述符)调用__set_name__挂钩,并且

第三类是另一个PEP的主题,PEP 520

还请注意,虽然__init_subclass__是在该类的继承树中使用元类的替代,但描述符类中的__set_name__是对具有描述符实例作为属性的类使用元类的替换。

票数 54
EN

Stack Overflow用户

发布于 2017-07-30 05:56:26

佩普487开始使用两个常见的元类应用程序,使它们更容易访问,而不必理解元类的所有细节。__init_subclass____set_name__这两个新特性在其他方面是独立的,它们不相互依赖。

__init_subclass__只是一个钩子方法。你可以用它做任何你想要的事。它对于以某种方式注册子类和在这些子类上设置默认属性值都很有用。

我们最近使用它来为不同的版本控制系统提供“适配器”,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class RepositoryType(Enum):
    HG = auto()
    GIT = auto()
    SVN = auto()
    PERFORCE = auto()

class Repository():
    _registry = {t: {} for t in RepositoryType}

    def __init_subclass__(cls, scm_type=None, name=None, **kwargs):
        super().__init_subclass__(**kwargs)
        if scm_type is not None:
            cls._registry[scm_type][name] = cls
    
class MainHgRepository(Repository, scm_type=RepositoryType.HG, name='main'):
    pass

class GenericGitRepository(Repository, scm_type=RepositoryType.GIT):
    pass

让我们为特定的存储库定义处理程序类,而不必使用元类或装饰器。

票数 88
EN

Stack Overflow用户

发布于 2017-07-31 03:47:52

我想添加一些有关元类和__init_subclass__的参考资料,这可能是有帮助的。

背景

__init_subclass__是作为创建元类的一种替代方法引入的。以下是核心开发人员之一布雷特·坎农( Brett )对佩普487谈话中的2分钟总结。

推荐参考资料

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45400284

复制
相关文章
jquery grid设置行背景色
项目中有一个需求,可以根据grid中某一列的值来设置该行的背景色,效果如下图所示。
全栈程序员站长
2022/09/14
1.4K0
jquery grid设置行背景色
Java 为 Excel 中的行设置交替背景色
在制作Excel表格时,通过将数据表中上下相邻的两行用不同的背景色填充,可以使各行的数据看起来更清楚,避免看错行,同时也能增加Excel表格的美观度。本文将介绍如何在Java程序中为 Excel 奇数行和偶数行设置交替背景色。
好好学java
2020/04/15
2K0
bootstrap 表格 行背景色
tr,td,th : class active 灰色 success 蓝色 warning 浅黄色 danger 浅红色
用户5760343
2022/01/10
1.3K0
bootstrap 表格 行背景色
ExtJs学习笔记(4)_EditorGridPanel(可编辑的网格控件)
这一节,我们将看到ExtJs功能强大的可编辑网格控件,几乎与VS.Net的GridView功能一样了,但是ExtJs的可是纯JS的UI 一.静态示例(改自ExtJs的官方示例) a.因为我们是采用
菩提树下的杨过
2018/01/24
3.5K0
设置导航栏的背景色和标签栏的背景色
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/51282200
用户1451823
2018/09/13
2.5K0
CSS设置DIV背景色渐变
FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=0, startColorStr=#AC07BD, endColorStr=#f6f6f8); /*IE 6 7 8*/ background: -ms-linear-gradient(top, #AC07BD, #f6f6f8); /* IE 10 */ background:-moz-linear-gradient(top, #AC07BD, #f6f6f8);/
Vicsh
2018/05/16
3K0
typecho设置360智能摘要
按照知识共享署名-非商业性使用 4.0 国际协议进行许可,转载引用文章应遵循相同协议。
逍遥子大表哥
2021/12/19
3911
typecho设置360智能摘要
Twentytwelve主题文章设置摘要
Twentytwelve是一款简明主题,但首页不能设置文章摘要,简单改动content.php文件一段代码,就可以显示文章摘要。 登录网站后台->外观->主题文件编辑器->找到content.php文件 或者FTP下载修改:路径:wp-content/themes/twentytwelve/content.php 大概40行,找到这一句:
zairun
2022/10/25
4140
pycharm设置背景色及字体_pycharm设置字体
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/175345.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
1.7K0
Extjs grid设置单元格字体颜色,单元格背景颜色,行背景颜色
1.用GridView中的getRowClass方法来实现颜色的渲染,status是在Store中定义的字段
全栈程序员站长
2022/09/18
3.4K0
Extjs grid设置单元格字体颜色,单元格背景颜色,行背景颜色
ExtJS4中设置tabpanel的tab高度问题
  最近碰到个问题,在ExtJS中应该如何设置tabpanel的tab的高度?因为默认情况下,tab的高度太矮了,以至于tab的标题底部字都被截掉。设置了个tabpanel.minHeight = ‘500’,但是这个仅仅是设置tabpanel的高度,而不是设置tabpanel的每个tab的标题的高度。随后,又改成了minHeight:‘50’,好像效果还是不理想。   如果只是为了每个tab的高度的话,自然tab高度依赖于tabpaenl的高度,tabpanel又依赖于外层组件的高度,如果仅仅把tabpa
hbbliyong
2018/03/05
1.9K0
纯CSS根据图片取色设置背景色
前几天无意间访问到了个韩国的动漫视频站,然后看到个页面每个div背景色都不同疑似根据图片进行的取色,然后就想看看他是用什么js设置的,f12一看发现好像不是js,然后我就以为是写死的,想看看怎么写的,结果一看不要紧,学到个骚操作。
泽泽社长
2023/04/17
1.3K0
纯CSS根据图片取色设置背景色
BCG网格控件单独设置颜色
三,CBCGPGridCtrlColorSingleDlg::OnInitDialog中增加如下代码。
全栈程序员站长
2022/11/09
6820
Eclipse设置背景色和字体大小
一、设置Eclipse代码编辑背景色(保护自己从这里开始) 1、打开window / Preference,弹出Preference面板 2、展开General标签,选中Editors选项,展开。 3、选中 Text Editors,右边出现TestEditors面板。 面板中有这样一个选项:Appearance color options ;其中是各种板块颜色的设置,其中有一项是background color,勾掉System Default,点击’color’,弹出 颜色选择面板,选择喜好的颜
苦咖啡
2018/05/08
3.1K0
iOS UIButton设置高亮状态下的背景色
UIButton一般分为高亮的普通两种状态,原生的方法可以设置这两种不同状态下的文字颜色,文字内容,背景图片,按钮图片。但是不能设置按钮的背景色。
Lee坚武
2019/12/18
1K0
pycharm设置背景色及字体_pycharm字体大小设置不了
点击Font可以选择不同字体,点击Size可以调节字体大小,右侧可以看预览效果,最后点击ok即可。
全栈程序员站长
2022/09/27
1.4K0
pycharm设置背景色及字体_pycharm字体大小设置不了
Extjs 项目中常用的小技巧,也许你用得着(4)---Extjs 中的cookie设置
1.ExtJs设置cookie两种方式 其一:设置cookie如下 saveacct=isForm.getForm().findField('itemselector').getValue(); Ext.util.Cookies.set('saveacct',saveacct);  取cookie中数据如下 var validStatus = Ext.util.Cookies.get("saveacct"); alert(validStatus);  其二:设置cookie var cookie = ne
hbbliyong
2018/03/05
1.3K0
Extjs 项目中常用的小技巧,也许你用得着(4)---Extjs 中的cookie设置
iOS-UIButton设置高亮状态下的背景色
UIButton一般分为高亮的普通两种状态,原生的方法可以设置这两种不同状态下的文字颜色,文字内容,背景图片,按钮图片。但是不能设置按钮的背景色。
Lee坚武
2019/12/13
1.8K0
WPF 如何给 Grid 的某一行添加背景色
其实在 WPF 里面是不存在单独设置 Grid 的某一行的配色,但是想要达到这个视觉效果,可以通过 Border 配合做到
林德熙
2022/08/12
2.5K0
ExtJs四(ExtJs MVC登录窗口的调试)
继上一节中实现了验证码http://www.cnblogs.com/aehyok/archive/2013/04/19/3030212.html,现在我们可以进行对登录界面进行整合调试了。
aehyok
2018/09/11
4.4K0
ExtJs四(ExtJs MVC登录窗口的调试)

相似问题

gem5: X86 KVM全系统支持readfile伪指令

10

LDR伪指令

22

MIPS "la“伪指令

12

翻译mips伪指令'rol‘

30

MIPS中用于除法的伪指令

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文