Как ссылаться на собственный контейнер объекта - PullRequest
2 голосов
/ 11 февраля 2012

Я работаю над улучшением работы с ООП в Python, и я столкнулся с настоящим хакерством в одной программе, которую я пишу. Это работает, но это беспорядок.

Ниже приведен короткий тестовый пример для иллюстрации. Он создает автомобили с 0, 2 или 4 окнами в списке, а затем сравнивает первый элемент с остальной частью списка.

Третий метод первого класса показывает, о чем я беспокоюсь. Я просто хочу иметь возможность ссылаться на любой контейнер, в котором находится этот конкретный объект, без необходимости каждый раз вызывать его из параметров. Это даже не так плохо в этом примере, но то, над чем я работаю, есть во многих местах, и это начинает сбивать с толку.

    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)

На всякий случай, Python 2.4.3 на RHEL. Спасибо!

1 Ответ

3 голосов
/ 11 февраля 2012

Если я правильно понимаю ваш вопрос, вы хотите прикрепить список автомобилей к объекту компании:

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)

Существует больше очистки, которая может быть сделана, но я думаю, что это должно решитьВаше непосредственное беспокойство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...