类的静态属性、类方法、静态方法
静态属性:
在类的函数属性里面,加上一个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__,再演示一个类方法和静态方法的实例,先保存这篇。