Python面向对象编程:如何将多个类对象链接到一个对象上
举个例子:
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)