※ 引述《sustainer123 (温水佳树的兄长大人)》之铭言:
: ※ 引述《sustainer123 (温水佳树的兄长大人)》之铭言:
: : Instance Methods
: : 实例方法 就class最常见那个
: : def foo(self)
: : 要有物件实例才能运行
: : 也就是说:
: : class.foo() #type error
: : obj = clsss()
: : obj.foo() #ok
: : 实例方法就是把实例本身传给参数
: : obj.foo() == foo(obj)
: : 透过self 实例方法可以修改同一对象的属性
: : Class Methods跟Static Methods明天再写
: : 反正我文章也还没看完
: 没写好 修改一下
: 实例方法可以修改类变量也能修改实例变量
: ex:
: class Test(object):
: class_attribute = 0
: def __init__(self, value):
: self.instance_attribute = value
: def instance_method(self):
: self.instance_attribute += 1
: Test.class_attribute += 1
: if __name__ == '__main__':
: print(Test.class_attribute) # 0
: t1 = Test(10)
: t1.instance_method()
: print(t1.class_attribute) # 1
: print(t1.instance_attribute) # 11
: t2 = Test(0)
: t2.instance_method()
: print(t1.class_attribute,t2.class_attribute) #2 2
: 大抵如此 不同实例共用类变量 然后能直接改类变类
: 但不同实例不共用实例变量
: classmethods
: 类方法
: py透过装饰器实现
: @classmethods
: 类方法就把类丢进参数
: 以上面的code当例子
: 假设类方法为class_methods()
: 你可以t1.class_methods()
: 也可以Test.class_methods()
: 实际上传入的参数长这样:
: class_methods(<class '__main__.Test'>)
: 类方法就是把类本身丢进参数
: 他可以直接修改类变量 但不能直接修改实例变量
: 假如你希望类方法修改实例变量 你必须传递实例做为类方法的参数
: 大概这样ㄅ staticmethod起床再说
staticmethod
静态方法
简单来说 就是不需要传入类也不需要传入实例但绑在的函数
py用装饰器实现
@staticmethod
AbstractMethods
抽象方法
有抽象方法的抽象类不能被实例化
只能被子类继承
而且子类必须覆写(override)抽象方法
否则会喷error
拿我前几天写的东西当例子:
class OrderConverter(ABC):
@abstractmethod
def convert(self, order_data):
pass
class SimpleOrderConverter(OrderConverter):
def convert(self, order_data):
if order_data['currency'] == "USD":
try:
order_data['price'] = str(int(order_data['price']) * 31)
except ValueError:
raise ValueError("价格转换失败")
return order_data
建立抽象方法的方式就是class继承ABC(Abstract Base Class)
然后在方法上挂上@abstractmethod
子类别必须实现convert() 否则会报错
使用时机
实例方法:就 oop最基本的 也没啥特定时机
静态方法:独立于实例外的辅助方法 老实讲我感觉直接写函数也差不多
类方法:可以取得类变量的静态方法ㄅ 老实说我没用过
抽象方法:
我多打这段就是为了它
假设原本有三个类A B C 三者都要实现foo()
直观上 我们可以让B继承A C继承B
但是 假设有天我们更改A BC就会连带受影响
我们改用抽象方法
定义一个抽象类 里面有抽象方法foo()
让A B C继承抽象类 A B C
直观上 我们可以想成原先的继承关系是一种链状关系
抽象方法则变成一个中心 底下为平行关系
其实就多型 姆咪