はじめに
移植やってます
init (Python)
class IteratorContextManager(NoOpBaseReader):
def __init__(self, *args, **kwargs):
self._func = kwargs.pop('parser_func')
self._args = args
self._kwargs = kwargs
if type(self) == IteratorContextManager:
self.reset()
super(IteratorContextManager, self).__init__(*args, **kwargs)
インスタンスを生成されるときに呼び出されます。
しかし、super.__init__
ってなかなか凄いですね。
initialize (Ruby)
class A
def initialize(*args)
puts "A initialize"
__init__(args)
end
def __init__(*args)
puts "A __init__" + args.to_s
end
end
class B < A
def initialize(*args)
puts "B initialize"
__init__(args)
end
def __init__(*args)
puts "B __init__" + args.to_s
super()
super
end
end
b = B.new("instance")
b.__init__("method")
# B initialize
# B __init__[["instance"]]
# A __init__[]
# A __init__[["instance"]]
# B __init__["method"]
# A __init__[]
# A __init__["method"]
initialize
をprivateからpublicにしようかなとも思いましたが、__init__
メソッドを用意して呼び出す形にする予定。
class IteratorContextManager < NoOpBaseReader
def initialize(*args, **kwargs)
__init__(args, kwargs)
end
def __init__(*args, **kwargs)
@_func = kwargs.delete('parser_func')
@_args = args
@_kwargs = kwargs
reset() if self.class == IteratorContextManager
super
end
end
単一継承かつ引数が同じなので、super
でよさそう。
メモ
- Python の
__init__
を学習した - 道のりは遠そう