class local instance variable

yuyaさんにクラスローカルインスタンス変数を教えてもらったは良いけれど、ネットで調べてみてもいろんな記述があって訳ワカメ。どうかくのが正しいのか良くわかんない。Smalltalkだとまんま ... class instanceVariableNames: '...' があるのだけれど・・・
とりあえず rubyで調べてみると、、、

  1. class << self; でクラスインスタンスの特異メソッドとして accessorを定義する
  2. @_hogehoge みたいに_を先頭につける

とか見つけたんだけど2つ目の奴は普通にcRuby 1.9.1だとなんかうまくいかない。これってsnapshot版とかで動かすのかな?よくわかんない。
とりあえず1で試してみた。

class Computer
    class << self; attr_accessor :machines, end
    attr_accessor :name
    @machines = []
    @@total_machines = []

    def self.total_machines
	@@total_machines
    end
    def register
	@@total_machines << self
	self.class.machines << self
    end
    def initialize name
	@name = name
    end
end

class DesktopPC < Computer
    @machines = []
end

class NotePC < Computer
    @machines = []
end

class Macintosh < Computer
    @machines = []
end

DesktopPC.new('DIY-1gou').register
DesktopPC.new('DIY-2gou').register

NotePC.new('Lavie').register
NotePC.new('VAIO-P').register
NotePC.new("Let's Note").register

Macintosh.new('Mac SE').register
Macintosh.new('iMac').register
Macintosh.new('MacBook').register
Macintosh.new('PowerMac').register

def p(ary)
    puts "#{ary.map(&:name)} #{ary.size}"
end

p Computer.total_machines
p DesktopPC.machines
p NotePC.machines
p Macintosh.machines
quartz% ruby classinstance.rb
["DIY-1gou", "DIY-2gou", "Lavie", "VAIO-P", "Let's Note", "Mac SE", "iMac", "MacBook", "PowerMac"] 9
["DIY-1gou", "DIY-2gou"] 2
["Lavie", "VAIO-P", "Let's Note"] 3
["Mac SE", "iMac", "MacBook", "PowerMac"] 4

pythonでもやってみた。こっちは泥臭い。もっときれいに書く方法がきっとあると思うのでもう少し調べる。

class Computer(object):
    _total_machines = []

    @classmethod
    def machines(cls):
	return cls._machines
    @classmethod
    def total_machines(cls):
	return cls._total_machines

    def register(self):
	Computer._total_machines.append(self)
	try:
	    type(self)._machines.append(self)
	except:
	    type(self)._machines = [self]
    def __init__(self, name):
	self.name = name

class DesktopPC(Computer):
    pass

class NotePC(Computer):
    pass

class Macintosh(Computer):
    pass

DesktopPC('DIY-1gou').register()
DesktopPC('DIY-2gou').register()

NotePC('Lavie').register()
NotePC('VAIO-P').register()
NotePC("Let's Note").register()

Macintosh('Mac SE').register()
Macintosh('iMac').register()
Macintosh('MacBook').register()
Macintosh('PowerMac').register()

def p(ary):
    print [item.name for item in ary], len(ary)

p(Computer.total_machines())
p(DesktopPC.machines())
p(NotePC.machines())
p(Macintosh.machines())
quartz% python classinstance.py
['DIY-1gou', 'DIY-2gou', 'Lavie', 'VAIO-P', "Let's Note", 'Mac SE', 'iMac', 'MacBook', 'PowerMac'] 9
['DIY-1gou', 'DIY-2gou'] 2
['Lavie', 'VAIO-P', "Let's Note"] 3
['Mac SE', 'iMac', 'MacBook', 'PowerMac'] 4

なんか実は良くわかってない。が、目的は達成しているような気はする。