如何创建可管理的对象属性
如何创建可管理的对象属性
# 在面向对象编程中,我们把方法看做对象的接口,直接访问对象的属性可能是不安全的
# 或设计上不够灵活 但是使用调用方法在形式上不如访问属性简洁。
'''
A.get_key() # 访问器
A.set_key() # 设置器
A.get
A.key = 'jr'
形式上 属性访问
实际上 调用方法
'''
class A:
def __init__(self,age):
self.age = age
def get_age(self):
return self.age
def set_age(self,age):
if not isinstance(age,int):
raise TypeError('Type Error')
self.age = age
# property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
# R = property(get_age,set_age) 形式上 属性访问 实际上 调用方法
@property # get方法
def S(self):
return self.age
@S.setter # set 方法
def S(self,age):
if not isinstance(age,int):
raise TypeError('age,int')
self.age = age
a = A(18)
# 文件读取的 str
# a.age = '20'
# print(type(a.age))
# a.set_age('20')
# print(a.get_age()) # age传字符串,打印结果是定义的TypError错误
# a.R = '20' # 赋值相当于是在调用set
# print(a.R) # 20 打印时相当于是get
a.S = 22
print(a.S)
形式上 属性访问
实际上 调用方法
总结两种方法:
第一种: R = property(get_age,set_age)
第二种:使用装饰器@property --> get方法 @S.setter -->set 方法
如何让类支持比较操作
如何让类支持比较操作
# 有时候我们希望自定义在的实例间可以使用< <= > >= == !=符号进行比较,我们自定
# 比较的行业,例如有一个矩形的类,比较两个矩形的实例时,比较的是人们的面积
from functools import total_ordering
import math
import abc (抽象基类需导入)
@total_ordering
class Shape(metaclass = abc.ABCMeta):
@abc.abstractmethod
def area(self):
pass
def __lt__(self, other): # 判断小于的方法
return self.area() < other.area()
def __eq__(self, other): # 判断等于
return self.area() == other.area()
class Rect(Shape):
def __init__(self,w,h):
self.w = w
self.h = h
def area(self):
return self.w * self.h
def __str__(self):
return '(%s,%s)'%(self.w,self.h)
#def __lt__(self, other): # __lt__判断小于的方法
# return self.area() < other.area()
# def __eq__(self, other): # __eq__判断等于
# return self.area() == other.area()
# rect1 = Rect(1, 2)
# rect2 = Rect(3, 4)
# print(rect1 > rect2) # 如果只有判断小于的方法用大于时 内部做了 rect2 < rect1
# print(rect1 > rect2)
class Circle(Shape):
def __init__(self,r):
self.r = r
def area(self):
return self.r ** 2 * math.pi # 求圆面积 导入import math , math.pi = π
# def __lt__(self, other): # 判断小于的方法
# return self.area() < other.area()
# def __eq__(self, other): # 判断等于
# return self.area() == other.area()
c = Circle(8)
rect = Rect(1,2)
print(c == rect) # 两个类圆和矩形面积作比较
以上代码有重复,需作优化,可做一个抽象基类 ,圆和矩形都继承Shape