在Python中,__init__
用于初始化类:
class Auth(object):
def __init__(self, oauth_consumer, oauth_token=None, callback=None):
self.oauth_consumer = oauth_consumer
self.oauth_token = oauth_token or {}
self.callback = callback or 'http://localhost:8080/callback'
def HMAC_SHA1():
pass
Perl 6中 init 的等效方法是什么?方法new
?
答案 0 :(得分:10)
Christopher Bottoms和Brad Gilbert的答案是正确的。但是,我想指出一些可能更容易理解Python和Perl6之间等价的事情。 首先,this page about going from Python to Perl6已满,包括this section on classes and objects。
请注意,Perl6中的__init__
相当于...... nothing 。构造函数是从实例变量自动生成的,包括默认值。但是,调用构造函数只需要Python中类的名称,而在Perl 6中使用new
。
另一方面,there are many different ways of overriding that default behavior,从定义您自己的new
到使用BUILD
, BUILDALL
or, even better, TWEAK
(通常定义为submethods
,因此不会被子类继承)。< / p>
最后,你有self
在Perl 6方法中引用对象本身。但是,我们通常会以这种方式看到它(如上例所示)self.instance-variable
→$!instance-variable
(请注意-
可以有效地成为Perl 6中标识符的一部分。)< / p>
答案 1 :(得分:9)
要迂腐,最接近的句法等价物是创建submethod BUILD
(或TWEAK
)。
这是最接近的翻译:
class Auth {
has $.oauth_consumer;
has $.oauth_token;
has $.callback;
submethod BUILD ( \oauth_consumer, \oauth_token=Nil, \callback=Nil ) {
$!oauth_consumer = oauth_consumer;
$!oauth_token = oauth_token // {};
$!callback = callback // 'http://localhost:8080/callback';
}
method HMAC_SHA1 ( --> 'pass' ) {}
}
这是一个更惯用的
class Auth {
has $.oauth_consumer;
has $.oauth_token;
has $.callback;
submethod BUILD (
$!oauth_consumer,
$!oauth_token = {},
$!callback = 'http://localhost:8080/callback',
) {
# empty submethod
}
method HMAC_SHA1 ( --> 'pass' ) {}
}
真实地说我会写出克里斯托弗所做的事。
答案 2 :(得分:8)
在Perl 6中,每个类都有默认的new
构造函数,可用于初始化对象的属性:
class Auth {
has $.oauth_consumer is required;
has $.oauth_token = {} ;
has $.callback = 'http://localhost:8080/callback';
method HMAC_SHA1() { say 'pass' }
}
my $auth = Auth.new( oauth_consumer => 'foo');
say "Calling method HMAC_SHA1:";
$auth.HMAC_SHA1;
say "Data dump of object $auth:";
dd $auth;
提供以下输出:
Calling method HMAC_SHA1: pass Data dump of object Auth<53461832>: Auth $auth = Auth.new(oauth_consumer => "foo", oauth_token => ${}, callback => "http://localhost:8080/callback")
我建议您查看Class and Object tutorial和Object Orientation上的页面(后一页包含HåkonHægland在您的问题评论中提到的Object Construction section)。