1、内置staticmethod & classmethod装饰器
Python中内置以上两个装饰器,内置的优点是:1、不需要实例化,可以直接调用;2、提升代码的可读性;因此python中有三种定义类的方法:常规方式;@classmethod修饰方式;@staticmethod修饰方式.
class A(object):
def foo(self, x):
print("executing foo(%s,%s)" % (self, x))
print('self:', self)
@classmethod
def class_foo(cls, x):
print("executing class_foo(%s,%s)" % (cls, x))
print('cls:', cls)
@staticmethod
def static_foo(x):
print("executing static_foo(%s)" % x)
定义方式
-
普通方法:
定义:
第一个参数为self,代表 实例本身
调用:
要有实例化的过程,通过 实例对象.方法名 调用 -
类方法
定义:
使用@classmethod
装饰器,第一个参数为类本身,所以通常使用cls命名做区分(非强制)
在类内可以直接使用类方法或类变量,无法直接使用实例变量或方法
调用:
无需实例化,直接通过 类.方法名 调用,也可以通过实例.方法名调用
注意:
类方法内不可以直接调用实例方法,也不可以调用实例变量
类和实例都可以直接调用类方法。
使用环境:在不修改原有代码的基础上,进行二次功能拓展。 -
静态方法
定义:
使用@staticmethod
装饰器,没有和类本身有关的参数
无法直接使用任何类变量、类方法或者实例方法、实例变量
调用:
无需实例化,直接通过 类.方法名 调用,也可以通过 实例.方法名 调用
总结
2、内置@property装饰器
Python内置的@property装饰器可以把类的方法伪装成属性调用的方式。也就是本来是Foo.func()的调用方法,变成Foo.func的方式。将一个方法伪装成为属性后,就不再使用圆括号的调用方式,而是类似变量的赋值、获取和删除方法。
class People:
def __init__(self, name, age):
self.__name = name
self.__age = age
@property
def age(self):
return self.__age
@age.setter
def age(self, age):
if isinstance(age, int):
self.__age = age
else:
raise ValueError
@age.deleter
def age(self):
print("删除年龄数据!")
obj = People("jack", 18)
print(obj.age)
obj.age = 19
print("obj.age: ", obj.age)
del obj.age
我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。
使用场景:
1.修饰方法,使得方法可以像属性一样访问。
2.与所定义的属性配合使用,这样可以防止属性被修改。
由于python进行属性的定义时,没办法设置私有属性,因此要通过@property的方法来进行设置。这样可以隐藏属性名,让用户进行使用的时候无法随意修改。个人理解是将变量进行封装,使其使用类似于const变量,提高变量阅读与修改的安全性。
原因主要是python中无法实现绝对的private 和 preotected属性。
类中 单下划线和双下划线的属性,在类外部,均可以使用实例化对象访问并且修改。区别在于:双下划线的属性名 ____FileName 被解释器重写为 _ClassName__FileName ,所以访问或者修改它的时候是 实例名._ClassName__FileName ,而单下划线的属性 _FileName,依然可以用 实例名._FileName 访问或修改。
参考:python @property的介绍与使用