我只想在明确要求的情况下设置属性。由于此属性将涉及额外的计算时间,因此我希望使用None
对其进行初始化,并且仅在调用函数要求这样做时才对其进行初始化。
例如:
class File:
def __init__(self, filename, content):
self.filename = filename
self.content = content
self.hash = None or self.get_hash()
def get_hash():
'''do some hashing there'''
我已经看到了这种类型的属性,但是不知道如何通过调用来触发函数
my_file = File('text.txt', 'Hello there')
my_file.hash
答案 0 :(得分:4)
通过为.hash
提供属性获取器,您可以完全创建所需的行为。 hash
的实际值将被“隐藏”为._hash
,这在Python中是常见的做法:
class File:
def __init__(self, filename, content):
self.filename = filename
self.content = content
self._hash = None
@property
def hash(self):
if self._hash is None:
# do some hashing here
self._hash = 'some hash'
return self._hash
f = File('myfile', 'some content')
print(f.hash)
当然,当您需要重新计算哈希值时,也可以有其他条件,它不一定是if self._hash is None
。您还可以在需要重新计算哈希值时将其重置。例如,当.content
更改时,您的哈希值可能会更改:
class File:
def __init__(self, filename, content):
self.filename = filename
self._content = content
self._hash = None
@property
def hash(self):
if self._hash is None:
# do some hashing here
self._hash = f'some hash based on {self._content}'
return self._hash
@property
def content(self):
return self.content
@content.setter
def content(self, value):
self._content = value
self._hash = None
f = File('myfile', 'some content')
print(f.hash)
f.content = 'changed content'
print(f.hash)
答案 1 :(得分:3)
尝试在创建对象时将其作为参数传递。
检查以下代码是否适合您:
class File:
def __init__(self, filename, content, request_hash=False):
self.filename = filename
self.content = content
self.hash = self.get_hash() if request_hash else None
def get_hash():
'''do some hashing there'''
my_file = File('text.txt', 'Hello there') #No Hash is generated
my_file = File('text.txt', 'Hello there', True) #Hash will be generated