如何实现可选属性?

时间:2019-01-17 06:11:26

标签: python

我只想在明确要求的情况下设置属性。由于此属性将涉及额外的计算时间,因此我希望使用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 

2 个答案:

答案 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