我正在嘗試創建一個 Company 類,到目前為止已經撰寫了以下代碼:
class Company:
def __init__(self, name, stocks_num, stock_price, comp_type):
self.name = name
self.stocks_num = stocks_num
self.stock_price = stock_price
self.comp_type = comp_type
if not self.valid(name,stocks_num, stock_price, comp_type):
raise ValueError("wrong Company Input")
def valid(self,name,stocks_num,stock_price,comp_type):
valid = True
check_list = [name, comp_type]
while check_list:
if ' ' in check_list[0] or not isinstance(check_list[0], str) or not check_list[0].replace(' ','').isalpha() or not check_list[0][0].isupper() \
or not len(check_list[0]) > 2:
valid = False
check_list.pop(0)
if not isinstance(stocks_num, int) or not stocks_num > 0:
valid = False
if not isinstance(stock_price, int) and not isinstance(stock_price, float) or not stock_price > 0:
valid = False
return valid
如您所見,我有這種對我很有效的驗證程序,問題是我想創建更改實體名稱、庫存編號等的函式,并且我希望這些函式輸入具有相同的驗證程序原來的實體輸入了。
例如:
def set_name(self, name):
# change company name
*checks if only the name is valid*
self.name = valid_new_name
有沒有辦法在不復制相同代碼的情況下做到這一點__init__?還是必須輸入所有valid()引數而不僅僅是我想要的?
uj5u.com熱心網友回復:
如果您要讓設定器檢查欄位的有效性,那么您可以簡單地讓建構式呼叫設定器。您的所有欄位都獨立于其他欄位,因此您實際上并不需要主有效性檢查功能。
class Company:
def __init__(self, name, stocks_num, stock_price, comp_type):
self.set_name(name)
self.set_stocks_num(stocks_num)
self.set_stock_price(stock_price)
self.set_comp_type(comp_type)
def set_name(self, name):
if not is_valid_name(name):
raise ValueError("bad name")
self.name = name
def set_stocks_num(self, stocks_num):
if not isinstance(stocks_num, int) or not stocks_num > 0:
raise ValueError("bad stocks_num")
self.stocks_num = stocks_num
def set_stock_price(self, stock_price):
if not isinstance(stock_price, int) and not isinstance(stock_price, float) or not stock_price > 0:
raise ValueError("bad stock_price")
self.stock_price = stock_price
def set_comp_type(self, comp_type):
if not is_valid_name(comp_type):
raise ValueError("bad comp_type")
self.comp_type = comp_type
def is_valid_name(name):
return (
' ' not in name and
isinstance(name, str) and
name.replace(' ','').isalpha() and
name[0].isupper() and
len(name) > 2
)
請注意,所有這些isinstance檢查都不是真正的 Pythonic。當您強制執行嚴格型別時,您會阻止呼叫者使用鴨子型別來傳遞有效但您沒有預料到的型別。我會洗掉它們。
說到 Pythonic,setter 也不是很流行。您可以將這些切換到屬性,以便用戶可以使用=.
uj5u.com熱心網友回復:
您可以將驗證檢查抽象為它自己的函式并在整個類中呼叫它。也可以在建構式中使用,物件初始化時會自動呼叫
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/437077.html
上一篇:創建一個回傳物件的函式
下一篇:卡在OOP類中
