Python 特殊方法之slots

2022-07-05 05:15:11 字數 1856 閱讀 3223

目錄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 ...