Python的静态属性、静态方法、类方法、实例方法介绍

处于初学阶段,有不对的地方希望大家指正,写的时候有点儿乱参考的其他博客文章,底部有链接地址,有兴趣的可以看原链接。

静态属性

@property 静态属性是绑定到实例上的,是通过实例.方法名 进行调用的。

静态属性的作用:就是封装逻辑,让用户再调用的时候完全感知不到后端的逻辑,就行在调用一个普通的数据属性一样。

特点:定义一个静态属性,内部会有一个 self 位置参数,self 代表实例,实例可以访问到实例的数据属性,实例同样也可以访问到类的数据属性和类的函数属性,也就是说

静态属性,既可以访问实例属性,也可以访问类的属性(类的数据属性和类的函数属性)—> self.类属性 或者 self.实例属性。

class MyClass():
    # 类属性
    name = "kaige"

    def __init__(self):
        self.age = 18
        print("此处是构造函数开始")

    @staticmethod
    def static_method():
        print("此处是静态方法")

    @classmethod
    def class_method(cls):
        print("此处是类方法")
        cls.property_method                         # 不能被类方法调用

    @property
    def property_method(self):
        print("此处是静态属性", self.name,self.age)    # 可以访问类的属性和实例属性
        self.class_method()                          # 可以访问类的方法
        # return "此处是静态属性"                      # 可以通过retrun返回一个值,调用时指定一个变量接收,就好像是调用一个实例的属性。

    def run(self):
        print("此处是实例方法")
        self.property_method                          # 可以被实例方法调用


if __name__ == '__main__':
    my_class = MyClass()           # 实例初始化时,执行构造函数
    my_class.property_method       # 调用静态属性时,不需要使用()的方法,就好像在调用实例的一个普通的属性

    my_class.run()
    
    
# 结果
此处是构造函数开始
此处是静态属性 kaige 18
此处是类方法
此处是实例方法
此处是静态属性 kaige 18
此处是类方法

小结:

  1. 定义时需要传递 self,代表实例;
  2. 需要实例化才能够调用(可以使用类名调用,返回的是类型所在内存地址);
  3. 可以通过self来访问类的属性和方法,也可以访问实例属性和方法;
  4. 调用时不需要再使用 “()” 的方法,例如如果不加@property属性的话,调用需要my_class.property_method();
  5. 可以被实例方法调用,不能被类方法调用;

静态方法

@staticmethod 不跟类绑定,也不跟实例绑定,只是一个类的工具包

用处:只是名义上归属类管理,不能使用类变量和实例变量,是类的工具包

特定:函数里既没有self参数,也没有cls参数,所以静态方法不能访问类属性和实例属性

#!/usr/bin/env python
# _*_ coding:utf8 _*_

class MyClass():
    # 类属性
    name = "kaige"

    def __init__(self):
        self.age = 18
        print("此处是构造函数开始")

    @staticmethod
    def static_method():
        print("此处是静态方法")
        MyClass.class_method()
        print(MyClass.name)             # 通过类名,可以访问类属性
        #print(MyClass.age)             # 不能访问实例属性,会报错
        

    @classmethod
    def class_method(cls):
        print("此处是类方法")

    @property
    def property_method(self):
        print("此处是静态属性")

    def run(self):
        print("此处是实例方法")


if __name__ == '__main__':

    my_class = MyClass()             # 实例初始化时,执行构造函数
    my_class.static_method()         # 可以通过实例化调用
    MyClass.static_method()          # 可以通过类名调用

小结:

  1. 定义时不需要传递 selfcls ,可以自定义传递的参数;
  2. 可以通过类名调用类的属性和方法,不能调用实例的属性和方法;
  3. 可以通过类名调用,也可以通过实例化调用(不推荐这么用),调用时需要加"()"

类方法

@classmethod 不跟任何实例捆绑,只跟类捆绑的方法

作用和目的:跟实例没有任何关系了,只是类级别的操作,类来调用自己的方法。

特点:函数的位置参数默认就被写成了cls, cls代表类, 类能访问到类的数据属性和类的函数属性(—> cls.类属性 或者 cls.实例属性),但是类不能访问到实例的属性。

#!/usr/bin/env python
# _*_ coding:utf8 _*_

class MyClass():
    # 类属性
    name = "kaige"

    def __init__(self):
        self.age = 18
        print("此处是构造函数开始")

    @staticmethod
    def static_method():
        print("此处是静态方法")

    @classmethod
    def class_method(cls):
        print("此处是类方法")
        print(cls.name)                  # 可以访问类的属性
        print(cls.static_method())       # 可以访问静态方法,不能访问静态属性和实例方法


    @property
    def property_method(self):
        print("此处是静态属性")


    def run(self):
        print("此处是实例方法")



if __name__ == '__main__':

    my_class = MyClass()           # 实例初始化时,执行构造函数
    my_class.class_method()        # 可以通过实例调用
    MyClass.class_method()         # 可以通过类名调用
    



小结:

  1. 定义时需要传递cls;
  2. 可以调用静态方法,可以调用类属性,不能调用实例的属性和方法;
  3. 可以通过实例调用,也可以通过类名调用

实例方法

我们最常用的就是实例方法,通过传递 self来定义。

#!/usr/bin/env python
# _*_ coding:utf8 _*_

class MyClass():
    # 类属性
    name = "kaige"

    def __init__(self):
        self.age = 18
        print("此处是构造函数开始")

    @staticmethod
    def static_method():
        print("此处是静态方法")

    @classmethod
    def class_method(cls):
        print("此处是类方法")


    @property
    def property_method(self):
        print("此处是静态属性")


    def run(self):
        print("此处是实例方法")
        self.static_method()          # 可以调用静态方法
        self.class_method()           # 可以调用类方法
        self.property_method          # 可以调用属性方法
        print(self.name)              # 可以调用类属性
        print(self.age)               # 可以调用实例属性


if __name__ == '__main__':

    my_class = MyClass()           # 实例初始化时,执行构造函数
    my_class.run()

小结:

  1. 定义时需要传递 self
  2. 可以调用静态属性、静态方法、类方法;
  3. 可以调用类属性和实例属性;
  4. 实例化调用,类名不能调用;

总结

静态属性 静态方法 类方法 实例方法 备注
标识 @property @staticmethod @classmethod
定义传递参数 self 不传递self和cls cls self
调用方法 实例 类名or实例 类名or实例 实例
是否可以访问类属性
是否可以访问类方法
是否可以访问实例属性
是否可以访问实例方法

参考链接:

https://my.oschina.net/u/4401557/blog/3904668
https://my.oschina.net/u/4284451/blog/3934601

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读