由于我對@property, @setter, 和 的理解有限@getter,我想出了以下代碼。
class BitCounts:
sign_bit = 0
exponent_bits = 0
mantissa_bits = 0
_total_bits = 0
@property
def total_bits(self):
return self._total_bits
@total_bits.setter
def total_bits(self):
self._total_bits = self.sign_bit self.exponent_bits self.mantissa_bits
class Single(BitCounts):
sign_bit = 1
offset = 0x7F
exponent_bits = 8
mantissa_bits = 23
_total_bits = BitCounts.total_bits
class Double(BitCounts):
sign_bit = 1
offset = 0x400
exponent_bits = 11
mantissa_bits = 52
_total_bits = BitCounts.total_bits
我的意圖是使用子類Single和Double其他函式作為一組選項,例如:
def some_function(option=Single):
print("exponent bit counts are: %d", option.exponent_bits)
print("mantissa bit counts are: %d", option.mantissa_bits)
print("total bit counts are: %d", option.total_bits)
我想total_bits使用子類Single或Double.
我試圖避免在子類級別執行計算的額外函式。
使用上述代碼,通過呼叫Single.total_bits, 或Double.total_bits,我只會收到一條訊息,說<property object at 0x000002258DF7CB30>我做錯了什么,我該如何解決?
uj5u.com熱心網友回復:
您使用帶有硬編碼靜態值的子類的方式表明這些應該是實體而不是子類。self即使您沒有創建任何實體,也建議您使用它。self指特定的事例。
此外,setter 通常將一個值作為引數。你的 setter 中沒有它,因為 total_bits 完全依賴于其他值。因此,您應該將 setter 計算移動到 getter 并回傳計算結果。
考慮:
class BitCounts:
def __init__(self, sign,offset, exponent, mantissa):
self.sign_bit = sign
self.offset = offset
self.exponent_bits = exponent
self.mantissa_bits = mantissa
@property
def total_bits(self):
return self.sign_bit self.exponent_bits self.mantissa_bits
# now make two instances:
single = BitCounts(1, 0x7F, 8, 23 )
double = BitCounts(1, 0x400, 11, 52)
print(single.total_bits)
# 32
print(double.total_bits)
# 64
uj5u.com熱心網友回復:
您可以使用:
class Single(BitCounts):
sign_bit = 1
offset = 0x7F
exponent_bits = 8
mantissa_bits = 23
_total_bits = BitCounts.total_bits
def get_total_bits(self):
# Update values here, example below
self._total_bits = self._total_bits 1
return self._total_bits
然后呼叫:
option = Single()
option.get_total_bits()
uj5u.com熱心網友回復:
這里的問題是您試圖從類中呼叫實體方法。
class A:
@property
def foo(self):
return 1
print(A.foo) # prints an object of function "foo"
print(A().foo) # prints "1"
為了實作這一點,至少根據我的知識,您需要使用類似于他們在這里所做的元類:Python 中的 Per-class @property 裝飾器
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368713.html
