Я работаю над улучшением работы с ООП в 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. Спасибо!