创建student类有两个实例属性,分别写出get,set构造方法,每个set方法中都有重复的条件判断语句,这是可以使用描述符
class Student:
def __init__(self,first_name,last_name):
self.first_name = first_name
self.last_name = last_name
@property
def first_name(self):
return self.__first_name
@first_name.setter
def first_name(self,first_name):
if not isinstance(first_name,str):
raise Exception("First name is not a str")
if len(first_name) == 0:
raise Exception("First name is Empty")
self.__first_name = first_name
@property
def last_name(self):
return self.__last_name
@last_name.setter
def last_name(self, last_name):
if not isinstance(last_name, str):
raise Exception("Last name is not a str")
if len(last_name) == 0:
raise Exception("Last name is Empty")
self.__last_name = last_name
描述符类,必须包含__set_name__方法和__set__或__get__或__del__方法
class RequiredString:
def __init__(self,trim: bool):
self.__trim = trim
def __set_name__(self, owner, name): # 将属性名传入描述符的类
self.__property_name = name
def __set__(self, instance, value): # set方法 内部进行逻辑判断
if not isinstance(value,str):
raise Exception(f"{self.__property_name} is not a String") # 不是字符串抛出异常
if self.__trim:
value = value.strip()
if len(value) == 0:
raise Exception(f"{self.__property_name} is empty") # 字符串为空抛出异常
instance.__dict__[self.__property_name] = value
def __get__(self, instance, owner): # 描述符get方法
if self.__property_name in instance.__dict__:
return instance.__dict__[self.__property_name]
创建新的类,类变量指向描述符对象
class Student2:
first_name = RequiredString(True)
last_name = RequiredString(True)
password = RequiredString(False)
实例化类对象,直接赋值给实例化对象的类变量
student2 = Student2()
student2.first_name = "QI"
student2.last_name = "Zhang"
student3 = Student2()
student3.first_name = "Jarry"
student3.last_name = "Zaho"
password = Student2()
password.password = " "
print(student2.first_name)
print(student3.last_name)
print(password.password)