python -- 面向对象 -- 静态方法

python -- 面向对象 -- 静态方法

面向对象高级语法部分

  • 经典类vs新式类  
  • 静态方法、类方法、属性方法[staticmethod classmethod property]
  • 类的特殊方法
  • 反射

静态方法[staticmethod]

静态方法,用作类似一个单纯的函数,实例化的对象中的self不会再和他有关系,唯一的关系就是需要通过类去调用,不能独立存在。也就是说,静态方法里无法访问实例中的任何属性,
可以看做用了这样的静态方法后,类就是一种工具包。

class Human(object):

    def __init__(self, name, age):
        self.NAME = name
        self.AGE = age

    def walk(self):
        print('{0} is walking alone.'. format(self.NAME))

    @staticmethod
    def eat(username):
        print('{0} is eating some food... ...'.format(username))


obj1 = Human('Gao', 30)
obj1.walk()  # Gao is walking alone.

# 以下就是静态方法的使用
obj1.eat("WTF")  # WTF is eating some food... ...

类方法 [classmethod]

类方法,只能访问类变量,不能访问实例变量。 一般情况用的很少。

class Human(object):

    # 定义一个类变量human_level
    human_level = '10'

    def __init__(self, name, age):
        self.NAME = name
        self.AGE = age


    def walk(self):
        print('{0} is walking alone.'. format(self.NAME))

    @classmethod  # 使用了类的方法
    def eat(self):
        print('{0} will eat some food... ...'.format(self.human_level))


obj1 = Human('Gao', 30)
obj1.walk()  # Gao is walking alone.

# 以下就是类方法的使用
obj1.eat()  # 10 will eat some food... ...

属性方法 [property]

把一个方法变成一个静态属性,不能通过加括号来调用。对用户来说是隐藏了过程。

class Human(object):

    # 定义一个类变量human_level
    human_level = '10'

    def __init__(self, name, age):
        self.NAME = name
        self.AGE = age


    def walk(self):
        print('{0} is walking alone.'. format(self.NAME))

    @property  # 使用了属性方法
    def eat(self):
        print('{0} will eat some food... ...'.format(self.human_level))


obj1 = Human('Gao', 30)
obj1.walk()  # Gao is walking alone.

# 以下就是属性方法的使用
obj1.eat  # 10 will eat some food... ...

如果原本方法需要传参数,使用了属性方法就无法通过传参数来实现。

class Human(object):

    # 定义一个类变量name
    name = "路人甲"

    def __init__(self, name, age):
        self.NAME = name
        self.AGE = age
        # 将需要传值的属性先初始化一个值,注意使用的是内置方法,注意写法
        self.__FOOD = None


    def walk(self):
        print('{0} is walking alone.'. format(self.NAME))

    @property  # 使用了属性方法,此处无法加参数
    def eat(self):
        # 路人甲 will eat some None... ...
        print('{0} will eat some {1}... ...'.format(self.name, self.__FOOD))

    # 用一下的方法,给上面的属性方法传参数
    @eat.setter
    def eat(self, food):
        print("我要吃{0}了。".format(food))
        # 将这里的food传给了内置方法的__FOOD
        self.__FOOD = food


obj1 = Human('Gao', 30)

obj1.eat  # 路人甲 will eat some None... ...

# 以下就是属性方法的使用,注意写法,不是在括号里加参数,而是通过给属性赋值
obj1.eat = '生菜'  # 我要吃生菜了。

# 上面的代码将“生菜”传给内置方法后,属性方法就可以再次去调用这个内置方法,
# 此时再用obj1.eat的属性方法,就可以将“生菜”传入
obj1.eat  # 路人甲 will eat some 生菜... ...

# 先把一个方法变成一个属性[@property],如果想给属性赋值,
# 就要在实例化的时候将赋值的对象写成内置方法,并初始化这个值[None]
# 再用赋值的[@eat.setter]的方法,将值传给对应的内置方法

由于属性方法,使用此类用法后,默认是不让删除属性方法,所以需要用[@eat.deleter]

class Human(object):

    # 定义一个类变量name
    name = "路人甲"

    def __init__(self, name, age):
        self.NAME = name
        self.AGE = age
        # 将需要传值的属性先初始化一个值,注意使用的是内置方法,注意写法
        self.__FOOD = None


    def walk(self):
        print('{0} is walking alone.'. format(self.NAME))

    @property  # 使用了属性方法,此处无法加参数
    def eat(self):
        # 路人甲 will eat some None... ...
        print('{0} will eat some {1}... ...'.format(self.name, self.__FOOD))

    # 用一下的方法,给上面的属性方法传参数
    @eat.setter
    def eat(self, food):
        print("我要吃{0}了。".format(food))
        # 将这里的food传给了内置方法的__FOOD
        self.__FOOD = food

    # 由于内置方法,不允许在删除,此时在要删除的时候,就要按照以下操作
    @eat.deleter
    def eat(self):
        del self.__FOOD
        print('Deleted it yet.')

obj1 = Human('Gao', 30)

obj1.eat  # 路人甲 will eat some None... ...

# 以下就是属性方法的使用,注意写法,不是在括号里加参数,而是通过给属性赋值
obj1.eat = '生菜'  # 我要吃生菜了。

# 上面的代码将“生菜”传给内置方法后,属性方法就可以再次去调用这个内置方法,
# 此时再用obj1.eat的属性方法,就可以将“生菜”传入
obj1.eat  # 路人甲 will eat some 生菜... ...

# 先把一个方法变成一个属性[@property],如果想给属性赋值,
# 就要在实例化的时候将赋值的对象写成内置方法,并初始化这个值[None]
# 再用赋值的[@eat.setter]的方法,将值传给对应的内置方法

del obj1.eat  # Deleted it yet.

'''
以下是结果:
路人甲 will eat some None... ...
我要吃生菜了。
路人甲 will eat some 生菜... ...
Deleted it yet.
'''

以下是来自Alex的例子,说明属性方法的用途

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


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

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


f = Flight("CA980")
f.flight_status

'''
以下是程序的结果:
checking flight CA980 status 
flight is arrived...
'''

当然可以改, 不过需要通过@proerty.setter装饰器再装饰一下,此时 你需要写一个新方法, 对这个flight_status进行更改。

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


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


    @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):
        status_dic = {
: "canceled",
:"arrived",
: "departured"
        }
        print("\033[31;1mHas changed the flight status to \033[0m",status_dic.get(status) )

    @flight_status.deleter  #删除
    def flight_status(self):
        print("status got removed...")

f = Flight("CA980")
f.flight_status
f.flight_status =  2 #触发@flight_status.setter 
del f.flight_status #触发@flight_status.deleter
posted @ 2017-10-09 16:00  gzz041  阅读(229)  评论(0)    收藏  举报