属性の追加

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