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

          静态属性:

          在类的函数属性里面,加上一个property的装饰器,这个函数属性就是静态属性,调用方式和数据属性一样了,不用加括号

class School:
    tag = 1
    def __init__(self,name,xiaozhang,lenth,widet):
        self.name = name
        self.xiaozhang = xiaozhang
        self.lenth = lenth
        self.widet = widet

    @property             #静态属性
    def test(self):
        return self.lenth*self.widet

s1 = School('xx大学',123,313,214)
print(s1.test)
print(s1.tag)

>>>66982
>>>1

        从例子看出,调用静态属性,和调用类的数据属性方法一样,这样用户不会发现和数据属性有什么不同,所以静态属性一般用来返回类比较常用的属性,比如一个圆的类,用户输入了半径,就可以定义一个圆面积的静态属性,也可以定义一个周长的静态属性,虽然我们是通过函数的方法实现,但用户调用的时候比较方便。

      类的函数属性可以分成分成两大类:

一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):

    1. 绑定到类的方法:用classmethod装饰器装饰的方法。

                为类量身定制

                类.boud_method(),自动将类当作第一个参数传入

              (其实对象也可调用,但仍将类当作第一个参数传入)

    2. 绑定到对象的方法:没有被任何装饰器装饰的方法(就是正常的函数属性)

               为对象量身定制

               对象.boud_method(),自动将对象当作第一个参数传入

             (属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)

       所以,绑定到类的方法,就是类方法,在类的函数属性里面,加上一个classmethod的装饰器,这个函数属性就是类方法,调用方式和函数属性一样,但是要把括号里的self改成cls

class School:
    tag = 1
    def __init__(self,name,xiaozhang,lenth,widet):
        self.name = name
        self.xiaozhang = xiaozhang
        self.lenth = lenth
        self.widet = widet

    @property             #静态属性
    def test(self):
        return self.lenth*self.widet

    @classmethod         #类方法
    def tell_info(cls):
        print(cls.tag)


#分别用类和实例调用
School.tell_info()

s1 = School('xx大学',123,313,214)
s1.tell_info()     #实例也可以调用,但是默认传的第一个参数仍然是类

>>>1
>>>1

二:非绑定方法:用staticmethod装饰器装饰的方法

        1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已

    注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说

          所以静态方法,就是在类内部用staticmethod装饰的函数,是普通函数。statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果,staticmethod只是名义上归属类管理,不能使用类变量和实例变量,是类的工具包

class School:
    tag = 1
    def __init__(self,name,xiaozhang,lenth,widet):
        self.name = name
        self.xiaozhang = xiaozhang
        self.lenth = lenth
        self.widet = widet

    @property             #静态属性
    def test(self):
        return self.lenth*self.widet

    @classmethod         #类方法
    def tell_info(cls):
        print(cls.tag)

    @staticmethod        #静态方法
    def test1(x,y):
        print(x*y)

#分别用类和实例调用
School.test1(3,4)
print(School.test1)

s1 = School('xx大学',123,313,214)
s1.test1(2,3)
print(s1.test1)

>>>12
>>><function School.test1 at 0x000002859750BAE8>   #就是普通函数
>>>6
>>><function School.test1 at 0x000002859750BAE8>   #就是普通函数

          后续会讲到__str__和__repr__,再演示一个类方法和静态方法的实例,先保存这篇。

posted @ 2019-04-03 15:09  彭方炎QAQ  阅读(2266)  评论(0编辑  收藏  举报