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_Class Design - Fatal编程技术网

Python面向对象模型

Python面向对象模型,python,oop,class-design,Python,Oop,Class Design,我有类似下面的东西 拥有属于某个州的同一型号多种颜色汽车的人 我已经设计了一个person类,将属性人名,汽车型号,汽车年份,汽车状态,以及汽车颜色作为属性。颜色应该是一个列表,因为一个人可以有许多不同颜色但型号相同的汽车 现在我如何找到和打印两个不同的人,他们拥有相同的车型和颜色,但在面向对象的术语中属于不同的状态 我是Python新手 在将颜色插入person对象时,如何将颜色插入列表以及如何从列表中检索颜色?我知道如何处理属性,但我对列表操作有点困惑 数据可以如下所示: person1 f

我有类似下面的东西

拥有属于某个州的同一型号多种颜色汽车的人

我已经设计了一个person类,将属性
人名
汽车型号
汽车年份
汽车状态
,以及
汽车颜色
作为属性。颜色应该是一个列表,因为一个人可以有许多不同颜色但型号相同的汽车

现在我如何找到和打印两个不同的人,他们拥有相同的车型和颜色,但在面向对象的术语中属于不同的状态

我是Python新手

在将颜色插入person对象时,如何将颜色插入列表以及如何从列表中检索颜色?我知道如何处理属性,但我对列表操作有点困惑

数据可以如下所示:

person1 ford   [red,blue,yellow] new-york
person2 honda  [red,blue]        new-york
person3 ford   [red,grey]        california
person4 ford   [red]             california
person5 honda  [red]             new-york
现在我的结果应该是:

[(person1,person5)]    (same model car,same color, different state)

您可能希望将
状态
汽车
分开建模。然后,每个人都可以拥有一个汽车列表,并且生活在一个州(甚至是一个州列表,取决于您的车型)。这些是具有-a关系。它还允许您稍后对
汽车
进行子类化,并在以后制作
跑车

您想了解一下列表操作:

$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> l=[]
>>> l.append("honda")
>>> l.append("ford")
>>> l
['honda', 'ford']
>>> l[0]
'honda'
>>> l.pop(0)
'honda'
>>> l.pop(0)
'ford'
>>> l.pop(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop from empty list
此代码比较成对的人。它不会将一个人与另一个人进行比较 他们自己。它不会比较生活在同一个州的人,因为你 要求“但属于不同的国家”。让我们过滤这些相同的状态 人们都出去了。它只比较拥有相同类型汽车的人。(如果 人们拥有不同类型的汽车,那么你只需再为他们添加两辆嵌套的汽车 循环。)然后它会记录下拥有相同颜色汽车的成对的人

这个算法中有一个潜在的错误:它将报告
[(person1,person2),
(个人2,个人1)]
。所以条目是重复的。有可能修改这个规则 算法只搜索上面或下面的三角形的人,如果你没有 要复制此文件:

results = []
for i=0; i<people.last_index-1; i++
    for j=i+1; j<people.last_index ; j++
        p1 = people[i] ; p2 = people[j]
        next if p1.state == p2.state
        next unless p1.car == p2.car
        foreach c1 in p1.colors
            foreach c2 in p2.colors
                results.append((p1,p2)) if c1 == c2
results=[]

对于i=0;有很多方法可以做到这一点。如果您有大量数据,那么我建议您继续使用python的内置sqlite支持(实际上并不难)处理基于数据库的实现。数据库引擎是专门为搜索而构建的。您需要两张桌子,因为每个人可以有多种颜色。person表将包含以下列:id、name、model、state。表中的颜色有:personid,color。personid列将包含颜色表中的行对应的id号。然后,颜色表中可以有多行具有相同的personid值(即列表的数据库版本)。sqlAlchemy是一个库,用于帮助使用python对象实现数据库,您可能会发现它更适合您正在尝试的操作。将指导您如何使用具有两个表(用户、地址)的sqlite数据库,这两个表与您需要的非常相似

现在,如果您想单独使用python类,您必须有一个人员实例列表,并遍历所有实例以查找匹配项。颜色匹配的一个简便简化方法是将颜色列表转换为集合并进行交集

>>> s1 = set(['red','blue','yellow'])
>>> s2 = set(['red','blue'])
>>> s1.intersection(s2)
set(['blue', 'red'])
通过人员实例列表进行迭代的快捷方式是使用python的itertools库和排列生成器

from itertools import permutations
people = ['p1', 'p2', 'p3']
for p1, p2 in itertools.permutations(people,2):
    print p1, p2

p1 p2
p1 p3
p2 p1
p2 p3
p3 p1
p3 p2
希望这足以帮助你前进。重新阅读您的问题,您可能需要更多地阅读python编程。但是为了解决您关于列表的问题,这里有一些代码可以帮助您

class Person(object):
    def __init__(self, name, model, colors, state):
        self.name = name
        self.model = model
        self.colors = colors
        self.state = state

p1 = Person('p1', 'ford', ['red', 'blue'], 'new-york')
p2 = Person('p2', 'honda', ['red', 'blue'], 'new-york')

persons = [p1, p2]
  # or
persons = []
persons.append(p1)
persons.append(p2)

p1.color.append('yellow')
  # or
persons[0].color.append('yellow')

非常感谢…这帮了大忙。谢谢你的回复。非常有帮助。
class Person(object):
    def __init__(self, name, model, colors, state):
        self.name = name
        self.model = model
        self.colors = colors
        self.state = state

p1 = Person('p1', 'ford', ['red', 'blue'], 'new-york')
p2 = Person('p2', 'honda', ['red', 'blue'], 'new-york')

persons = [p1, p2]
  # or
persons = []
persons.append(p1)
persons.append(p2)

p1.color.append('yellow')
  # or
persons[0].color.append('yellow')