python - 如何从python中的单个类继承一个类的多个实例
问题描述
免责声明:我是编程新手,刚刚开始学习类和继承,所以也许是我缺乏理解导致了我的问题?
我在单独的文件person.py
和address.py
.
人员类从地址类继承,但是一个人可以有多个地址(邮政、物理等)。我如何为每种类型继承地址类的多个实例。
我的目标是最终为未来的项目提供一个通用类库,因此非常感谢围绕这个概念的任何帮助或建设性意见。
我希望能够创建类似于以下代码的内容,其中邮政地址和物理地址都使用Address
该类:
employee = Person()
employee.set_postal_address("342 Gravelpit Terrace","Bedrock")
employee.set_physical_address("742 Evergreen Tce", "Springfield")
下面是我的代码,我没有Address()
在Person()
类中创建任何引用,因为我不确定如何实现这一点?
# address.py
class Address:
def __init__(self):
self.__line1 = None
self.__line2 = None
self.__town_city = None
self.__post_code = None
self.__state_region = None
self.__country = None
# Line 1
def get_line1(self):
return self.__line1
def set_line1(self, line1):
self.__line1 = line1
#etc....
# person.py
from address import *
class Person(Address):
def __init__(self):
self.__first_name = None
self.__last_name = None
self.__postal_address = []
self.__physical_adress = []
def set_postal_address(self):
# use the address class
# return a list of address values
self.__postal_address = []
def set_physical_address(self):
# use the address class
# return a list of address values
self.__physical_address = []
#etc...
任何帮助是极大的赞赏。如果有更好的处理方法,请告诉我。
解决方案
Address
创建类时不一定需要继承Person
。实现目标的一种方法是在类中初始化一个Address
类对象Person
。
# address.py
class Address:
def __init__(self, **kwargs):
self.__line1 = kwargs.get('__line1')
self.__line2 = kwargs.get('__line2')
self.__town_city = kwargs.get('__town_city')
self.__post_code = kwargs.get('__post_code')
self.__state_region = kwargs.get('__state_region')
self.__country = kwargs.get('__country')
# Line 1
def get_line1(self):
return self.__line1
def set_line1(self, line1):
self.__line1 = line1
#etc....
# person.py
from address import *
class Person:
def __init__(self, **kwargs):
self.__first_name = kwargs.get('__first_name')
self.__last_name = kwargs.get('__last_name')
self.__postal_address = None
self.__physical_address = None
def set_postal_address(self, **kwargs):
# use the address class
self.__postal_address = Address(**kwargs)
def set_physical_address(self, **kwargs):
# use the address class
self.__physical_address = Address(**kwargs)
#etc...
这允许您防止继承的方法在给定的类对象中变得混乱,但仍然允许您保持良好的类结构。
然后您可以执行以下操作:
bob=Person(__first_name='Bob', __last_name='Smith')
bob.set_postal_address(__line1='42 Wallaby Way', __town_city='Sydney')
# Since we are using kwargs.get() any not specified Kwarg comes out as None.
# Now `__postal_address` is its own Address class and comes with Address methods
bob.__postal_address.set__line2('Apt 3B')
现在有时您希望从更高级别的类继承常用方法。您可以在此处阅读有关 python 类的更多信息:(https://docs.python.org/3.6/tutorial/classes.html)
推荐阅读
- sql - 如何使用 CASE 条件过滤双重数据?
- java - 将字符串返回给 main 方法
- cookies - 检查第三方 Cookie 是否被禁用
- google-maps - 在颤动中单击时更改折线的颜色
- spring-boot - 我可以从 GraphQLResolver 安全地回调 GraphQLQueryResolver 吗?
- python - ValueError:在 Django 框架中没有足够的值来解包(预期 2,得到 1)
- pine-script - 从脚本中排除今天的数据
- reporting - 在 splunk 中将多个报告作为一封电子邮件发送
- python - 无法在 ubuntu 中杀死 conda
- python - matplotlib 在极坐标图中颤动