Python面向对象编程:如何将多个类对象链接到一个对象上

0 投票
2 回答
1860 浏览
提问于 2025-04-18 04:33

举个例子:

class Person(object):
    name = ""
    age  = ""

class Address(object):
    title  = ""
    street = ""
    city   = ""
    state  = ""
    zip    = ""

假设我创建了两个“人”对象。

sally = Person()
sally.name = "Sally"
sally.age  = 22

john  = Person()
john.name = "John"
john.age  = 20

如果每个人只有一个地址,我可以直接把地址作为这个人对象的一个属性放进去。但是,这些人都有工作地址和家庭地址。

sally_work = Address()
sally_work.title  = "Work"
sally_work.street = "123 Random Ave"
etc..

sally_home = Address()
sally_home.title  = "Home"
sally_home.street = "456 Foo St"
etc..

john_work = Address()
john_work.title  = "Work"
john_work.street = "7899 Work Ave"
etc..

john_home = Address()
john_home.title  = "Home"
john_home.street = "541 Character Ave"
etc..

现在,这些地址和对应的人对象之间没有任何联系。在Django中,我会写 person = Models.ForeignKey(Person) 来建立这种联系。我的问题是,在普通的Python面向对象编程中,什么可以和ForeignKey相对应呢?也就是,如何把每个地址和它对应的人联系起来。

谢谢大家的帮助!

2 个回答

1

你现在的做法有不少问题。首先,像 name(名字)、age(年龄)这些应该是实例属性,而不是类属性。你可以这样来定义类:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

class Address:
    def __init__(self, title, street, city, state, zip):
        self.title = title
        self.street = street
        self.city = city
        self.state = state
        self.zip

其实,你不一定要为每个人固定一个存储地址的接口,可以用不同的名字来代表不同的人,比如这样:

sally = Person('Sally', 22)
sally.work_address = Address('Work', ...)
sally.home_address = Address('Home', ...)

还有一点需要注意的是,其实你并不一定需要一个类来存储一堆属性。你可以使用 namedtuple 来实现。

from collections import namedtuple

Person = namedtuple('Person', ('name', 'age'))
Address = namedtuple('Address', ('title', 'street', 'city', 'state', 'zip'))
3

针对你具体的问题,你可能想要为每个Person(人)准备一个addresses(地址)的列表,然后把这些地址加到Person对象里。

class Person(object):
    name = ""
    age  = ""
    addresses = []

不过,你现在定义这个对象的方式会导致所有的Person实例共享同一个name(名字)、age(年龄)等等。

你可能想要写成下面这样,同时也要为class Address(地址类)写一个类似的定义。

class Person(object):
    def __init__(self):
       self.name = ""
       self.age  = ""
       self.addresses = []

为了把Address(地址)添加到Person(人)里,你可以这样写:

sally.addresses.append(sally_work)
sally.addresses.append(sally_home)

撰写回答