Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何引用对象';自己的集装箱_Python_Oop - Fatal编程技术网

Python 如何引用对象';自己的集装箱

Python 如何引用对象';自己的集装箱,python,oop,Python,Oop,我正在努力改进Python中的OOP,在我编写的一个程序中,我遇到了一些真正的黑客行为。这是可行的,但却一团糟 下面是一个简短的测试示例。它将0、2或4个窗口的汽车创建到一个列表中,然后将第一个元素与列表的其余部分进行比较 第一节课的第三种方法说明了我所担心的。我只是希望能够引用特定对象所在的任何容器,而不必每次都从参数调用它。在这个例子中,它甚至没有那么糟糕,但是我正在研究的东西在很多地方都有它,以至于它开始变得令人困惑 import random class Car:

我正在努力改进Python中的OOP,在我编写的一个程序中,我遇到了一些真正的黑客行为。这是可行的,但却一团糟

下面是一个简短的测试示例。它将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)

为了以防万一,在RHEL上安装Python 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):
        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)

可以对它进行更多的清理,但我认为这应该可以解决您当前的问题。

小心使用
id
作为标识符。也要小心没有窗户的汽车!这里不清楚你要做什么(什么是“容器”?),但是看起来你在寻找继承…如果你想得到比这里最明显的提示,你可以考虑把它移到CoDeEvIEW.SE。还有很多需要改进的地方。我认为,寻找相同车门的汽车的操作是对收藏的操作,而不是收藏的成员。一般来说,我会避免让对象过度意识到它们可能所在的容器。我认为您唯一的其他选择是使用
gc
模块进行黑客攻击,但我认为这并不符合您所寻找的精神。是的,这正是我所寻找的。下一个问题实际上是如何将两种类型的对象连接在一起,但这样做不仅如此。你管它叫什么?我还没有在我所做的OOP研究中看到过这个主题。无论如何,非常感谢!我不知道你把他们连在一起到底是什么意思。我注意到您不需要在每个方法中传递
id
,而且
typesToNum
还有很大的改进空间。如果有什么区别的话,它应该是汽车上的静态方法,但是让汽车类型知道它有多少门才更有意义。这里有一个改进的版本,我突然想出:真棒。我已经研究了新版本,并将所有内容都内化了。我对将对象“连接”在一起而不仅仅是让一个对象继承另一个对象感到困惑,这是我学到的主要部分。我习惯了蜥蜴是爬行动物是从类中继承下来的一种动物,但一堆汽车并不是一家公司。然而,这是有道理的,我现在看到了所涉及的机制。再次感谢!