描述符(__get__(),__set__(),__delete__())

描述符是什麼

描述符本質就是一個新式類,在這個新式類中,至少實現了__get__(),__set__(),__delete__()中的一個,這也被稱爲描述符協議
  __get__():調用一個屬性時,觸發
  __set__():爲一個屬性賦值時,觸發
  __delete__():採用del刪除屬性時,觸發
class String(object):
	def __init__(self, name):
		self.name = name

	def __get__(self, instance, cls):
		print("__get__", instance)
		if instance is None:
			return self
		return instance.__dict__[self.name]

	def __set__(self, instance, value):
		print("__set__", value)
		if not isinstance(value, str):
			raise TypeError('Expected a string')
		instance.__dict__[self.name] = value


class Person:
	name = String('name')

	def __init__(self, name):
		self.name = name


a = Person("天鴿")
a.name = "天恩"
print(a.name)

運行輸出:

__set__ 天鴿
__set__ 天恩
__get__ <__main__.Person object at 0x0000027B2ABC2710>
天恩

# https://www.cnblogs.com/Meanwey/p/9898222.html

__getattr__,__setattr__

(1)__getattr__(self, item):

在訪問對象的item屬性的時候,如果對象並沒有這個相應的屬性,方法,那麼將會調用這個方法來處理。。。這裏要注意的時,假如一個對象叫fjs, 他有一個屬性:fjs.name = “fjs”,那麼在訪問fjs.name的時候因爲當前對象有這個屬性,那麼將不會調用__getattr__()方法,而是直接返回了擁有的name屬性了

(2)__setattr__(self, item, value):

當試圖對象的item特性賦值的時候將會被調用。

class Student:
	def __getattr__(self, item):
		return item + ' is not exits'

	def __setattr__(self, key, value):
		print("__setattr__",key,value)
		self.__dict__[key] = value

	def __getitem__(self, item):
		print("__getitem__", item)
		return self.__dict__[item]

	def __setitem__(self, key, value):
		print("__setitem__",  key, value)
		self.__dict__[key] = value


s = Student()
print(s.name)  # 調用__getattr__方法 輸出'name is not exits'
s.age = 1  # 調用__setattr__ 方法 __setattr__ age 1 
print(s.__dict__) # 輸出 {'age': 1}
print(s.age)  # 輸出 1
print(s['age'])  # 調用 __getitem__方法 輸出1
s['name'] = 'tom'  # 調用 __setitem__ 方法
print(s.__dict__)
print(s.name)
print(s["name"])  # 調用 __getitem__方法 輸出 tom

__getattr__爲內置方法,當使用點號獲取實例屬性時,如果屬性不存在就自動調用__getattr__方法
__setattr__當設置類實例屬性時自動調用,如j.name=5 就會調用__setattr__方法  self.[name]=5
因爲這個類是從dict繼承來的,是dict的超類
所以 self[attr]=value 相當於調用dict的下標方法
與 a={}   ; a[attr]=value意思一樣
__getitem__(self,key):返回鍵對應的值。
__setitem__(self,key,value):設置給定鍵的值
__delitem__(self,key):刪除給定鍵對應的元素。

__getattr__內置使用點號獲取實例屬性屬性如 s.name,自調用__getattr__
__setattr__設置類實例屬性 如s.name='tom',自調用__setattr__
__getitem__ 使用[]獲取實例屬性 如s['name'],自調用__getitem__
__setitem__ 使用[]設置實例屬性如 s['name'] = 'tom' ,自調用__setitem__
__dict__ 爲參數字典
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章