【发布时间】:2020-09-24 13:13:17
【问题描述】:
假设我有一个 Python 类实例,这是一个非常简单的示例:
class Book:
def __init__(self, genre):
self.genre = genre
self.author = self.title = None
return
def assign_author(self, author_name):
self.author = author_name
return
def assign_title(self, title_name):
self.title = title_name
return
western_book_template = Book("Western")
出于各种原因,我希望每个类实例能够生成自身的深层副本,然后对新对象执行一些额外的操作。
以下是我想知道的:
- 最有效的方法是什么?
- 最 Pythonic 的一个(最佳实践)呢?
- 存储在实例中的数据量以及为获取该数据而执行的计算量是否会影响先前的答案?如果有,怎么做?
我知道我可以使用western_book_1 = copy.deepcopy(western_book_template),然后直接在western_book_1 上执行我想要的所有其他操作,但是这样做不是更好吗:
class Book:
def __init__(self, genre):
self.genre = genre
self.author = self.title = None
return
def assign_author(self, author_name):
self.author = author_name
return
def assign_title(self, title_name):
self.title = title_name
return
def generate_specific_book(self, author_name, title_name):
specific_book = Book(self.genre)
specific_book.assign_author(author_name)
specific_book.assign_title(title_name)
return specific_book
western_book_template = Book("Western")
western_book_1 = western_book_template.generate_specific_book("John E. Williams", "Butcher's Crossing")
这将使我能够更好地控制复制的内容和不复制的内容,并允许我在一个地方执行所有额外的操作。我假设在需要大量计算来获取存储在实例中的数据的情况下,上述方法效率低下。
【问题讨论】:
-
关于您对效率的担忧,我不确定我是否关注您。如果您必须进行大量计算来生成数据,那么这就是您必须做的,否则您如何避免呢?无论如何,以上对我来说似乎很好而且很正常。顺便说一句,不要在 python 中编写像
assign_author这样的方法,即setter。或吸气剂。 -
在效率和数据量方面,如果类实例中包含一些计算时间较长的数据,那么直接复制数据的值而不是经过再次生成所述数据。在这种情况下,
deepcopy肯定会比其他选项更有效。我很好奇你对 setter 和 getter 的评论。如果有一些在类实例外部计算的属性要分配给类实例,那么不使用 setter/getter 的方法是什么?谢谢!