Python 什么';Perl 6中的uu init_uuu的等效方法是什么?

Python 什么';Perl 6中的uu init_uuu的等效方法是什么?,python,raku,Python,Raku,在Python中,\uuuuuu init\uuuu用于初始化类: 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

在Python中,
\uuuuuu init\uuuu
用于初始化类:

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

在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;
提供以下输出:

调用方法HMAC_SHA1: 通过 对象身份验证的数据转储: Auth$Auth=Auth.new(oauth_消费者=>“foo”,oauth_令牌=>${},回调=>”http://localhost:8080/callback")
我建议查看和上的页面(后一页包括Håkon Hægland在对您的问题的评论中提到的)。

要学究气,最接近的语法等价物是创建一个
子方法构建(或
TWEAK

这是最接近的翻译:

类身份验证{ 拥有$.oauth_消费者; 具有$.oauth_令牌; 有$.callback; 子方法生成(\oauth\u使用者,\oauth\u令牌=Nil,\callback=Nil){ $!oauth_consumer=oauth_consumer; $!oauth_token=oauth_token//{}; $!callback=callback/'http://localhost:8080/callback'; } 方法HMAC_SHA1(->“通过”){ }
这是一个更惯用的说法

类身份验证{ 拥有$.oauth_消费者; 具有$.oauth_令牌; 有$.callback; 子方法构建( $!oauth_消费者, $!oauth_令牌={}, $!回调=http://localhost:8080/callback', ) { #空子方法 } 方法HMAC_SHA1(->“通过”){ }
要真正地道,我会写克里斯托弗所做的。

克里斯托弗·巴茨和布拉德·吉尔伯特的回答是正确的。然而,我想指出一些事情,这些事情可能会使我们更容易理解Python和Perl6之间的等价关系。 首先,是充满了他们,包括

请注意,Perl6中与
\uuuuu init\uuuuu
等效的是。。。没有什么。构造函数是从实例变量(包括默认值)自动生成的。然而,在Python中调用构造函数只需要类的名称,而在Perl 6中它使用
new

另一方面,从定义自己的
new
到使用(通常被定义为
submethods
,因此不被子类继承)


最后,您确实有
self
在Perl6方法中引用对象本身。但是,我们通常会这样看待它(如上面的示例所示)
self.instance变量
→ <代码>$!实例变量(请注意,
-
可以是Perl 6中标识符的有效部分)。

请注意,如果属性没有默认值,但必须指定,您也可以将属性标记为
是必需的
。您还可以争辩说,Rakudo Perl 6会自动为您生成
init
方法。@ElizabethMattijsen谢谢!根据您的建议进行编辑。我认为Python语法会要求使用
oauth\u。在Perl 6中,不必两次列出所有公共属性,这真是太好了。我假设它是实例变量,但从文本的上下文来看,这可能被解释为应用于
self
,这可能是错误的。它现在更好了吗?是的,现在更好了。说“BUILD,BUILDALL[…]或称为子方法的调整”可能有点误导。如果将它们定义为
submethod
,则它们只是子方法。它们通常是这样定义的,这就是它们不可继承的原因。但是,如果您将它们定义为
method
,它们将是可继承的。也可编辑。现在好多了?
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")