class CheckBaseObject(object):
sex = "男"
def __init__(self, name, age):
"""初始化"""
self.name = name
self.age = age
def __str__(self):
"""调用类可直接返回"""
return self.name
def __getattr__(self, name):
"""属性不存在时自动调用"""
if name == "my_attr":
return "Default Value"
else:
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")
def __setattr__(self, key, value):
"""属性不存在时自动调用设置"""
if key == "my_attr":
print(f"Setting '{key}' to '{value}'")
super().__setattr__(key, value.upper())
else:
super().__setattr__(key, value)
def __call__(self):
"""可将类当做函数调用"""
print('My name is %s.' % self.name)
return 1
@classmethod
def get_obj(cls):
"""类方法 可以调用雷属性 使用类名调用"""
return cls.sex
@staticmethod
def set_obj():
"""静态方法 不可以调用实例方法和属性 可以被调用 独立操作可使用"""
return "my func is static"
@property
def get_name(self):
"""将函数转换成属性"""
return self._score
@get_name.setter
def get_name(self, value):
"""扩展方法 可设置属性后调用get_name获取属性"""
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
if __name__ == "__main__":
a = CheckBaseObject("yyy", 18)
a.attr = '男'
print(a.attr)
b = a()
print(b)
print(a)
python类中部分魔术方法基本使用
最新推荐文章于 2024-07-17 21:04:45 发布