2012-02-11 18 views
2

私はPythonでOOPをうまく利用するために取り組んでいます。私が書いている1つのプログラムでは、本当にハッキリしています。それは動作しますが、それは混乱です。オブジェクトのコンテナを参照する方法

以下は、説明するための短いテスト例です。 0、2、または4つのウィンドウのカーをリストに作成し、最初の要素と残りのリストを比較します。

ファーストクラスの3番目の方法は、私が心配していることを示しています。私はちょうどパラメータから呼び出すことなく、特定のオブジェクトが入っているコンテナを毎回参照できるようにしたい。この例ではそれほど悪くはありませんが、私が取り組んでいることは、混乱し始めている場所が多岐にわたります。

import random 

    class Car: 
      def __init__ (self, company, doors, id): 
        self.company = company 
        self.doors = doors 
        self.id = id 

      def printDoors(self, id): 
        print 'Car ' + `self.id` + ' has ' + `self.doors` + ' doors.' 

      def findSameDoors(self, id): 
        # these next lines are the ones that really bother me 
        companyAbstract = self.company + 's' 
        for i in eval(companyAbstract): 
          if self.id != i.id and self.doors == i.doors: 
            print 'Car ' + `i.id` + ' does too!' 

    class Company: 
      def __init__ (self, types): 
        self.types = types 

      def typesToNum(self): 
        result = [] 
        for i in self.types: 
          if i == 'sedan': 
            result.append(4) 
          elif i == 'convertible': 
            result.append(2) 
          else: 
            result.append(0) 
        return result 


    porsche = Company(['sedan', 'convertible']) 
    honda = Company(['sedan', 'convertible', 'motorcycle']) 

    porsches = [] 
    for i in range(10): 
      porsches.append(Car('porsche', random.choice(porsche.typesToNum()), i)) 

    hondas = [] 
    for i in range(10): 
      hondas.append(Car('honda', random.choice(honda.typesToNum()), i)) 


    porsches[0].printDoors(0) 
    porsches[0].findSameDoors(0) 

場合によっては、RHELのPython 2.4.3が重要です。ありがとう!

+0

['id()'はPythonの組み込み型](http://docs.python.org/library/functions.html#id)のように、識別子として 'id'を使うことに注意してください。窓がない車にも注意してください!ここで何をしようとしているのか(コンテナは何ですか?)、本当に明確ではありませんが、継承を探しているように見えます... – Johnsyweb

+0

ここで最も明白なヒントをもっと知りたい場合は、 codereview.SEに。改善すべき*ロット*があります。 –

+2

私は、同じドアを持つ車を見つける操作は、コレクションの操作であり、コレクションのメンバーではないと主張します。一般に、私はオブジェクトが過度にそれらがあるかもしれないコンテナを認識することを避けるでしょう。 –

答えて

3

私は右のあなたの質問を理解していた場合は、会社のオブジェクトへの車のリストを添付したい:

import random 

class Car: 
    def __init__ (self, company, doors, id): 
     self.company = company 
     self.doors = doors 
     self.id = id 

    def printDoors(self, id): 
     print 'Car ' + `self.id` + ' has ' + `self.doors` + ' doors.' 

    def findSameDoors(self, id): 
     for i in self.company.cars: 
      if self.id != i.id and self.doors == i.doors: 
       print 'Car ' + `i.id` + ' does too!' 

class Company: 
    def __init__ (self, types): 
     self.types = types 
     self.cars = [] 

    def typesToNum(self): 
     result = [] 
     for i in self.types: 
      if i == 'sedan': 
       result.append(4) 
      elif i == 'convertible': 
       result.append(2) 
      else: 
       result.append(0) 
     return result 


porsche = Company(['sedan', 'convertible']) 
honda = Company(['sedan', 'convertible', 'motorcycle']) 

for i in range(10): 
    porsche.cars.append(Car(porsche, random.choice(porsche.typesToNum()), i)) 

for i in range(10): 
    honda.cars.append(Car(honda, random.choice(honda.typesToNum()), i)) 


porsche.cars[0].printDoors(0) 
porsche.cars[0].findSameDoors(0) 

あり、それに行うことができるより多くのクリーンアップがありますが、私はそれはあなたが解決すべきだと思います即時の懸念。

+0

あなたの唯一の他のオプションは 'gc'モジュールでいくつかのハッカーであると思いますが、再探しています。 –

+0

ええ、これは私が探しているものです。次の次の質問は、実際には2つのタイプのオブジェクトを一緒に結合する方法になりますが、これはそれ以上のことです。あなたはそれを何と呼んでいますか?私がやったOOPの研究の話題は見ていない。とにかく、ありがとう! –

+1

あなたはそれらを一緒に結合することによって何を意味するか正確にはわかりません。私はあなたがそれぞれのメソッドに 'id'を渡す必要はないことに気づいたし、' typesToNum'も改善の余地がかなりありました。何かがあれば、それはCarの静的メソッドでなければなりませんが、Carタイプにいくつのドアがあるかを知ることは意味があります。ここでは、私はホイップアップされた改善版です:https://gist.github.com/1797426 –