静态属性、类方法、静态方法 静态属性


转自(https://blog.51cto.com/u_10836356/2108790)

一、前情提要:

实例或对象:只有数据属性

类:有数据属性和函数属性

实例对象:可以调用类的数据属性和函数属性

二、静态属性

@property (静态属性)----------将函数属性伪装成数据属性访问

类:不能调用(调用只能拿到一个内存地址,并不会执行)

实例:可以调用

class Player:
    def __init__(self, name, age, height, position):
        self.name = name
        self.age = age
        self.height = height
        self.position = position

    @property
    def Jumpshot(self):
        print('%s来了一记后仰跳投' % self.name)

    def dumk(self):
        print('%s高高跃起,献上一记战斧劈扣' % self.name)

p1 = Player('lebron', 34, '2.03m', 'sf')
p1.Jumpshot    #lebron来了一记后仰跳投
p1.dumk()    #lebron高高跃起,献上一记战斧劈扣
print(Player.Jumpshot)    #
print(Player.dumk(p1))    #lebron高高跃起,献上一记战斧劈扣

作用:当对象有重复的方法需求时,可将这个方法封装到类中。

名词解释:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

在面向对象编程中,封装(encapsulation)是将对象运行所需的资源封装在程序对象中——基本上,是方法和数据。对象是“公布其接口”。其他附加到这些接口上的对象不需要关心对象实现的方法即可使用这个对象。这个概念就是“不要告诉我你是怎么做的,只要做就可以了。”对象可以看作是一个自我包含的原子。对象接口包括了公共的方法和初始化数据。

三、类方法

@classmethod(类方法)---------与类绑定,与实例无任何关系

类:可以调用

对象:不可以调用(其实可以调用d1.test_classmethod(),不会出错, 但是一般不会这样定义和调用)

class Player:
    home = 'NBA'
    def __init__(self, name, age, height, position):
        self.name = name
        self.age = age
        self.height = height
        self.position = position


    def Jumpshot(self):
        print('%s来了一记后仰跳投' % self.name)

    @classmethod
    def info(cls,name):
        print('%s是一名%s球员' % (name,cls.home))   
Player.info('lebron james') #用类来调用类方法,这样就与实例隔离了   lebron james是一名NBA球员

作用:之前如果要调用类的数据属性,先要实例化对象,再通过这个对象来调用类的数据属性。而通过类方法,可不用实例化,直接调用类的数据属性。

四、静态方法

@staticmethod(静态方法-类的工具包)----------不与类绑定,也不与对象绑定,名义上归属类管理,但是不能调用类属性和实例属性。

类:可以调用

对象:可以调用

class Player:
    home = 'NBA'
    def __init__(self, name, age, height, position):
        self.name = name
        self.age = age
        self.height = height
        self.position = position


    def Jumpshot(self):
        print('%s来了一记后仰跳投' % self.name)

    @staticmethod
    def info(p1, p2):
        print('%s和%s正在1v1斗牛' % (p1, p2))

pla = Player('lebron', 34, '2.03m', 'sf')
pla.info('lebron james', 'kevin durant')    # 对象可以调用   lebron james和kevin durant正在1v1斗牛
Player.info('lebron james', 'kevin durant')    #类也可以调用   lebron james和kevin durant正在1v1斗牛