目錄python中,每個類都會有例項屬性,預設情況下python會使用乙個字典去儲存乙個物件的例項屬性(物件.dict),這樣就會讓這個例項化的物件沒有任何的限制,可以隨意的給物件做任何屬性設定,為了避免這個問題,我們可通過__slots__
來限制例項物件的屬性。
1、所以slots是如何做到節約記憶體的?
由於每次例項化乙個物件都需要分配乙個全新的dict,會浪費空間,如果有了slots
,它只會分配乙個元組,裡面包括了當前能訪問到的屬性,因此類的例項只能擁有slots
中定義的變數,而且不能再增加新變數。
2、slots最終的目的是什麼?
最終目的--->節約記憶體
1.沒有使用slots
class user(object):
def __init__(self, name, pwd, is_login=false):
self.name = name
self.pwd = pwd
self.is_login = is_login
u1 = user(name='root', pwd='123456', is_login=true)
print(u1.__dict__) #
u1.age = 30 # 隨意的增加屬性
2.使用slots
class user(object):
# slots定義的元素必須是字串型別
__slots__ = ['name', 'pwd', 'is_login']
def __init__(self, name, pwd, is_login=false):
self.name = name
self.pwd = pwd
self.is_login = is_login
u1 = user(name='root', pwd='123456', is_login=true)
列印一下物件.__dict__
,會發現dict已經不存在了,也就是類不會分配dict給例項化物件了
print(u1.__dict__) # attributeerror: 'user' object has no attribute '__dict__'
我們給物件設定屬性,直接報錯,不允許設定屬性
u1.age = 30 # attributeerror: 'user' object has no attribute 'age'
3.如果我們需要預留新屬性,可在slots裡提前定義好屬性
class user(object):
# 預留乙個age屬性,後續可以為該屬性賦值
__slots__ = ['name', 'pwd', 'is_login', 'age']
def __init__(self, name, pwd, is_login=false):
self.name = name
self.pwd = pwd
self.is_login = is_login
u1 = user(name='root', pwd='123456', is_login=true)
u1.age = 30 # 賦值預留屬性
print(u1.age)
note:使用slots要注意,slots定義的屬性僅對當前類起作用,對繼承的子類是不起作用的,除非子類也定義slots
python 特殊方法之 call
call 在python中,函式其實是乙個物件 f abs f.name abs f 123 123由於 f 可以被呼叫,所以,f 被稱為可呼叫物件。所有的函式都是可呼叫物件。乙個類例項也可以變成乙個可呼叫物件,只需要實現乙個特殊方法 call 我們把 person 類變成乙個可呼叫物件 class...
Python 類特殊方法之 getitem
凡是在類中定義了這個 getitem 方法,那麼它的例項物件 假定為p 可以像這樣 p key 取值,當例項物件做p key 運算時,會呼叫類中的方法 getitem 一般如果想使用索引訪問元素時,就可以在類中定義這個方法 getitem self,key 先用乙個誇張一點的例子來說明這個問題。cl...
Python 特殊方法
特殊方法,也稱為魔術方法 特殊方法都是使用 開頭和結尾的 特殊方法一般不需要我們手動呼叫,需要在一些特殊情況下自動執行 定義乙個person類 class person object 人類 def init self,name age self.name name self.age age str ...