python面向对象-@property-@staticmethod-@classmethod

背景:

flask里面会出现这样的用法,自己写的和源码都会有

参考:

Python 类 Property Staticmethod Classmethod详解 - 知乎 (zhihu.com)

过程:

1-@property,将一个方法变为静态属性,可以通过实名.方法名调用

"""
@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)

2- @staticmethod,和类基本无关系

python面向对象-@property-@staticmethod-@classmethod_第1张图片

"""
可以看成是静态方法已经跟这个类没关系了,相当于已经脱离了这个类,
是一个完全独立的函数,
只是调用的时候必须通过这个类, 或者为了规范代码而将函数放到类中
类中定义函方法 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)

3-@classmethod

"""
@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()

4-总结

多用多回顾会好一点

你可能感兴趣的:(python,python)