属性の追加
Python
クラスを定義し直すと生成済みのインスタンスは以前のクラス仕様に準じ、以降のインスタンス生成は新しいクラス仕様のみに準ずる。
>>> class Hoge(object): ... def __init__(self, greeting): ... self.greeting = greeting ... def say(self): ... print self.greeting ... >>> foo = Hoge("aha") >>> foo.say() aha >>> class Hoge(object): ... def say2(self): ... print "hello" ... >>> foo.say() aha >>> foo.say2() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: Hoge instance has no attribute 'say2' >>> bar = Hoge("hello") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: this constructor takes no arguments >>> bar = Hoge() >>> bar.say2() hello
Ruby
既存クラスに動的に属性を追加できる。
irb(main):001:0> class Hoge irb(main):002:1> def initialize(greeting) irb(main):003:2> @greeting = greeting irb(main):004:2> end irb(main):005:1> end => nil irb(main):006:0> foo = Hoge.new("aha") => #<Hoge:0x2992ecc @greeting="aha"> irb(main):007:0> class Hoge irb(main):008:1> def say irb(main):009:2> puts @greeting irb(main):010:2> end irb(main):011:1> end => nil irb(main):012:0> foo.say aha => nil
属性の定義を削除したい場合はundefを使用する。
irb(main):001:0> class Hoge irb(main):002:1> def say irb(main):003:2> puts "Hello" irb(main):004:2> end irb(main):005:1> end => nil irb(main):006:0> foo = Hoge.new => #<Hoge:0x77a88> irb(main):007:0> foo.say Hello => nil irb(main):008:0> class Hoge irb(main):009:1> undef say irb(main):010:1> end => nil irb(main):011:0> foo.say NoMethodError: undefined method `say' for #<Hoge:0x77a88> from (irb):11 from :0