<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 問題 你在類中需要重復的定義一些執行相同邏輯的屬性方法,比如進行類型檢查,怎樣去簡化這些重復代碼呢? ## 解決方案 考慮下一個簡單的類,它的屬性由屬性方法包裝: class Person: def __init__(self, name ,age): self.name = name self.age = age @property def name(self): return self._name @name.setter def name(self, value): if not isinstance(value, str): raise TypeError('name must be a string') self._name = value @property def age(self): return self._age @age.setter def age(self, value): if not isinstance(value, int): raise TypeError('age must be an int') self._age = value 可以看到,為了實現屬性值的類型檢查我們寫了很多的重復代碼。 只要你以后看到類似這樣的代碼,你都應該想辦法去簡化它。 一個可行的方法是創建一個函數用來定義屬性并返回它。例如: def typed_property(name, expected_type): storage_name = '_' + name @property def prop(self): return getattr(self, storage_name) @prop.setter def prop(self, value): if not isinstance(value, expected_type): raise TypeError('{} must be a {}'.format(name, expected_type)) setattr(self, storage_name, value) return prop # Example use class Person: name = typed_property('name', str) age = typed_property('age', int) def __init__(self, name, age): self.name = name self.age = age ## 討論 本節我們演示內部函數或者閉包的一個重要特性,它們很像一個宏。例子中的函數`<span class="pre" style="box-sizing: border-box;">typed_property()</span>`?看上去有點難理解,其實它所做的僅僅就是為你生成屬性并返回這個屬性對象。 因此,當在一個類中使用它的時候,效果跟將它里面的代碼放到類定義中去是一樣的。 盡管屬性的`<span class="pre" style="box-sizing: border-box;">getter</span>`?和?`<span class="pre" style="box-sizing: border-box;">setter</span>`?方法訪問了本地變量如?`<span class="pre" style="box-sizing: border-box;">name</span>`?,?`<span class="pre" style="box-sizing: border-box;">expected_type</span>`?以及?`<span class="pre" style="box-sizing: border-box;">storate_name</span>`?,這個很正常,這些變量的值會保存在閉包當中。 我們還可以使用?`<span class="pre" style="box-sizing: border-box;">functools.partial()</span>`?來稍稍改變下這個例子,很有趣。例如,你可以像下面這樣: from functools import partial String = partial(typed_property, expected_type=str) Integer = partial(typed_property, expected_type=int) # Example: class Person: name = String('name') age = Integer('age') def __init__(self, name, age): self.name = name self.age = age 其實你可以發現,這里的代碼跟8.13小節中的類型系統描述器代碼有些相似。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看