python中的静态方法、类方法、属性方法(福利:关于几种方法更好的解释)

该部分的三个属性都是高级方法,平时用的地方不是很多

一、静态方法

静态方法的使用不是很多,可以理解的就看一下,用的地方不是很多


class Dog(object):
    def __init__(self,name):
        self.name = name


    # 静态方法:平时用的不是很多,可以通过联想中国和台湾的关系来记忆
    # 只是名义上归类管理,实际上在静态方法中访问不了类或实例中的任何属性
    @staticmethod    # 变成静态方法之后该方法就和类没什么关系了,就只是相当于一个单纯的函数,
    def eat(self):  # 并且没法使用类里面的变量了,但是可以使用自己的变量
        # def eat(self, food):
        # print("%s is eating %s..."%(self.name,food))
        print("%s is eating %s..." % ("ddd", "sss"))



d = Dog("zhangsan")
d.eat("baozi")

在这里插入图片描述

二、类方法

和静态方法一样,用的地方不是很多

class Dog(object):

    n = "ddd"  # 类变量
    def __init__(self,name):
        self.name = name

    # 类方法:无论实例变量怎么改,都是依据类变量来变化和静态方法一样 基本用不到
    @classmethod # 类方法只能访问类变量,不能访问实例变量
    def eat(self,food):  # 实例变量
        print("%s is eating %s..."%(self.n,food))

d = Dog("zhangsan")  # 因为类方法只能访问类变量,所以无论该参数是什么,结果都是'ddd'
d.eat("baozi")

三、属性方法

属性方法的使用有实例,但是用的地方也不是很多

class Dog(object):

    def __init__(self,name):
        self.name = name
        self.__food = None

    # 属性方法: 把一个方法变成一个静态属性,就不能再调用了
               # 隐藏了方法,对用户来说就是提供了一个API,实现就一步
    @property
    def eat(self):  # 实例变量
        print("%s is eating %s..."%(self.name,self.__food))

    @eat.setter  # 如果想使属性变量可以传参数(修改属性),可以这么设置
    def eat(self,food):
        print("set to food:",food)
        self.__food = food

    @eat.deleter # 可以通过此方法删掉属性
    def eat(self):
        del self.__food
        print("删完了")

d = Dog("zhansgan")
# d.eat()  # 这是不行的,因为静态方法变成属性之后就不能在调用了
d.eat   # 只能以方法的形式来调用,就不能传参数了

del d.eat  # 如果不通过@eat.deleter,这个操作是没用的
d.eat  # 报错之后说明属性通过@eat.deleter得到了删除

属性方法的使用可以结合下面的实例来理解:


class Flight(object):
    def __init__(self,name):
        self.flight_name = name


    def checking_status(self):
        print("checking flight %s status " % self.flight_name)
        return  0

    @property
    def flight_status(self):
        status = self.checking_status()
        if status == 0 :
            print("flight got canceled...")
        elif status == 1 :
            print("flight is arrived...")
        elif status == 2:
            print("flight has departured already...")
        else:
            print("cannot confirm the flight status...,please check later")
    @flight_status.setter
    def flight_status(self,status):
        print("flight %s has changed status to %s" %(self.flight_name,status))
f = Flight("CA980")
f.flight_status
f.flight_status = 2

在这里插入图片描述

福利:

1.在网上浏览到的关于几种方法更好的解释详情请见:https://www.cnblogs.com/wcwnina/p/8644892.html
2.不能获得的,这个和变量的生命周期有关,一个方法中的一个变量的生命周期是从它在这个方法中声明开始,到这个方法调用完毕时结束。
因此你在类A中的方法a中无法调用类B中的方法b中的变量var_b,因为这个变量在这个时间还没有被创建。

posted @ 2018-10-26 10:53  南邮吴亦凡  阅读(238)  评论(0编辑  收藏  举报