我正在嘗試使用attrs模塊創建模型類。在我的腳本CollectionModel中,類是在類中繼承的User。所以從邏輯上講, 中的所有屬性都CollectionModel應該在User. 但是在嘗試從字典中創建用戶的新實體時(可以使用 attrs),它表明屬性CollectionModel中不存在User
我的腳本:
from bson import ObjectId
from attrs import asdict, define, field, validators, Factory
import time
@define
class CollectionModel:
""" Base Class For All Collection Schema"""
_id : str = field(converter=str, default=Factory(ObjectId))
_timestamp : float = field(default=Factory(time.time))
def get_dict(self):
return asdict(self)
def update(self):
self._timestamp = time.time()
@define
class User(CollectionModel):
username : str = field(factory = str, validator=validators.instance_of(str))
userType : str = field(factory = str, validator=validators.instance_of(str))
password : str = field(factory = str, validator=validators.instance_of(str))
user_object = User()
new_user_object = User(**asdict(user_object))
在這里,我試圖從user_object. 它顯示以下錯誤。
TypeError: User.__init__() got an unexpected keyword argument '_id'
我猜一開始沒有啟動父類。因此,我嘗試使用該super()功能啟動它,并且根據 attrs 檔案,它應該使用__attrs_pre_init__. 從檔案中:
存在的唯一原因
__attrs_pre_init__是讓用戶有機會呼叫super().__init__(),因為一些基于子類的 API 需要這樣做。
所以修改后的子類就變成了這樣。
@define
class User(CollectionModel):
username : str = field(factory = str, validator=validators.instance_of(str))
userType : str = field(factory = str, validator=validators.instance_of(str))
password : str = field(factory = str, validator=validators.instance_of(str))
def __attrs_pre_init__(self):
super().__init__()
但問題仍然存在。我是否以錯誤的方式執行 OOP?還是只是attrs模塊的錯誤?
uj5u.com熱心網友回復:
我已經解決了這個問題,有兩個問題。第一個,在 python 中,在屬性名稱之前的下劃線使其成為私有屬性。因此,雖然從字典創建新實體_id是一個意外的關鍵。
第二個問題是,我_id在使用 MongoDB 時確實需要一個欄位。在 MongoDB 中,檔案_id被保留用作主鍵。
現在第一個問題可以通過替換_id來解決id_(是的,下劃線在另一邊,因為對于python中的變數名id來說實際上是一個糟糕的選擇)。
對于第二個問題,我進行了很多搜索以創建id_欄位的別名。attrs但是在使用模塊時并不容易。get_dict()因此,在將資料放入 MongoDB 集合之前,我已經修改了獲取完美字典的方法。
這是修改后的CollectionModel類和User類:
@define
class CollectionModel:
""" Base Class For All Collection Schema"""
id_: ObjectId = field(default=Factory(ObjectId))
timestamp : float = field(default=Factory(time.time))
def get_dict(self):
d = asdict(self)
d["_id"] = d["id_"]
del d["id_"]
return d
def update(self):
self.timestamp = time.time()
@define
class User(CollectionModel):
username : str = field(factory = str, validator=validators.instance_of(str))
userType : str = field(factory = str, validator=validators.instance_of(str))
password : str = field(factory = str, validator=validators.instance_of(str))
現在列印一個實體:
user_object = User()
print(user_object.get_dict())
輸出:
{'timestamp': 1645131182.421929, 'username': '', 'userType': '', 'password': '', '_id': ObjectId('620eb5ae10f27b87de5be3a9')}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429024.html
標籤:Python mongodb 哎呀 蟒蛇数据类 蟒蛇属性
下一篇:如何在C 中正確繼承抽象類?
