Perl 6中与Python的__init__等价的方法是什么?是否为new?
在Perl 6中对应Python
__init__的方法 嘿,刚好对Perl 6的类初始化这块门儿清,来给你掰扯清楚:
首先明确说:和Python里__init__职责最匹配的是Perl 6的BUILD子方法,而new是类的构造器入口,两者有区别但又紧密相关,咱们一步步说:
1. BUILD:实例初始化的核心(对应Python的__init__)
当你调用Auth.new(...)创建实例时,Perl 6会自动调用BUILD来初始化实例的属性——这和Python里__init__负责给刚创建好的实例赋值属性的逻辑完全一致。
把你给出的Python Auth类转换成Perl 6版本,大概是这样:
class Auth { # 先声明类的属性 has $.oauth_consumer; # $. 表示公共属性,自动生成访问器 has %.oauth_token; # %. 表示哈希类型的属性 has $.callback; # 这个BUILD就对应Python的__init__ submethod BUILD(:$oauth_consumer, :$oauth_token = {}, :$callback = 'http://localhost:8080/callback') { # 给属性赋值 $.oauth_consumer = $oauth_consumer; %.oauth_token = $oauth_token; $.callback = $callback; } method HMAC_SHA1() { # 这里写你的方法逻辑就行 } }
这里有几个Perl 6的小细节要提:
BUILD要用submethod定义,它是类的子方法,只会在实例构建时被自动调用,不会被子类继承(除非子类显式调用)- 参数用命名参数(
:$param)的写法是Perl 6的惯用风格,调用的时候可以写Auth.new(oauth_consumer => $my_consumer),可读性拉满 - 属性声明用
has关键字,不同的符号($./%.)对应不同的属性类型和访问权限
2. 那new方法是干啥的?
new是Perl 6类的默认构造器,它的核心职责是创建实例对象,然后自动触发BUILD来完成初始化。你也可以自定义new方法,但一般没必要——除非你需要在实例创建前后做一些全局逻辑(比如实现单例模式、参数预验证之类的)。
举个自定义new的例子:
class Auth { # ... 还是刚才的属性声明 ... method new(:$oauth_consumer, :$oauth_token = {}, :$callback = 'http://localhost:8080/callback') { # 先做参数验证,比如必填项检查 die "oauth_consumer是必填项哦!" unless $oauth_consumer; # 调用bless创建实例(这是默认new的核心操作) my $instance = self.bless(:$oauth_consumer, :$oauth_token, :$callback); # 可以加一些额外的初始化操作 $instance._setup_something(); return $instance; } # 私有辅助方法 submethod _setup_something() { # 逻辑代码 } }
但再次强调:如果只是单纯初始化实例属性,用BUILD就足够了,它和Python的__init__职责完全对应,是最直接的等价方法。
总结一下:
- 直接对应Python
__init__的是Perl 6的BUILD子方法,负责实例属性的初始化 new是类的构造器方法,核心是创建实例并自动调用BUILD,可自定义但非初始化的核心
内容的提问来源于stack exchange,提问作者chenyf
相关产品推荐
相关产品推荐

