flask里面会出现这样的用法,自己写的和源码都会有
Python 类 Property Staticmethod Classmethod详解 - 知乎 (zhihu.com)
"""
@property 属性方法
属性方法的作用就是通过@property把一个方法变成一个静态属性
实例名.方法
"""
class Foo(object):
def __init__(self,name):
self.name = name
def func(self):
print("%s:基本方法"%self.name)
@property # pro = property(pro)
def pro(self):
print("%s:属性方法"%self.name)
f1 = Foo("elephant111")
f1.func()
# 调用
f1.pro
"""
@property属性方法 封装类中的方法,给用户更加简单的调用方式,隐藏具体的实现细节。
@method.getter 获取属性
@method.setter 设置属性, 可以写更多逻辑(比如格式转换,类型判断),并提醒其他人这里面可能有magic
@method.deleter 删除属性
"""
class Foo(object):
def __init__(self,name):
self.__name = name
def func(self):
# print("%s:基本方法"%self.__name)
pass
@property # pro = property(pro)
def pro(self):
return self.__name
@pro.setter
def pro(self,name):
self.__name = name
@pro.getter
def pro(self):
return self.__name
@pro.deleter
def pro(self):
del self.__name
# print()
f1 = Foo("elephant111")
print(f1.pro)
f1.pro="张三"
print(f1.pro)
del f1.pro
# 删除之后是无法显示__name的
print(f1.pro)
"""
可以看成是静态方法已经跟这个类没关系了,相当于已经脱离了这个类,
是一个完全独立的函数,
只是调用的时候必须通过这个类, 或者为了规范代码而将函数放到类中
类中定义函方法 PyCharm 提示Method xxx may be ‘static’,
原因是该方法不涉及对该类属性的操作,编译器建议声明为@staticmethod,面向对象思想体现
看起来像是被家族[类]声明断绝金钱关系的富家子弟[静态方法],
富家子弟只是和家族名存实亡[表面还是走类的形式来调用],实际没啥关系
"""
import time
class Date(object):
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day
@staticmethod
def now():
print("静态方法-我和这个类【不使用其中的类变量,实例变量。。。,self都没有】看起来没啥关系")
t = time.localtime()
return Date(t.tm_year, t.tm_mon, t.tm_mday)
date = Date.now()
print(date.year,date.month,date.day)
date = Date(1999,12,12)
"""
@classmethod
类方法只能访问类变量,不能访问实例变量, 也就是跟类有关,跟实例无关。
类方法当然只能访问类变量拉!!!cls
cls隐式传入当前类
"""
class ParentClass(object):
var = "test for parent"
@classmethod
def clasmethod(cls):
print(cls.var)
class SubClass(ParentClass):
var = "test for sub"
"""
子类默认调用父类的构造方法
相当于
def __init__(self):
super().__init__()
当SubClass.clasmethod()时
super().__init__()传入了当SubClass这个类
所以父类clasmethod(cls)里面的cls变为了SubClass这个类,
即输出test for sub
"""
ParentClass.clasmethod()
SubClass.clasmethod()
多用多回顾会好一点