python类中的静态属性
实际上就是property特性在类中的方法前加上@property进行装饰。
@property
def dizhi(self):
return self.size
静态属性(用来封装逻辑)与实例对象绑定。
在将方法装饰成静态属性后,调用的时候就像是在调用属性(对象名.方法名)。
方法必须有返回值
print(p1.dizhi)
像访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值。
将一个类的方法定义成property特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个方法然后计算出来的,这种特性的使用方式遵循了统一访问的原则
python类中的静态方法(类的工具包)
与静态属性一样,需要在方法前用@staticmethod装饰,而它所装饰的方法既不和实例化对象绑定,也不和类绑定所以它既不能调用实例化对象的属性,也不能使用类的属性。
@staticmethod
def area(width, height):
print('学校有%d大' % (width*height))
可以看出width和height和对象还有类都没关系,因为其名义上是归属于类的字典里,所以调用是使用类名.方法名(参数…)调用,当然也可以使用对象进行调用(本质上一样,因为对象调用会先在对象的字典中找方法,找不到再去类的字典中找)。
print(School.__dict__) # 这样查看类的字典
print(p1.__dict__) # 这样查看对象的字典
python的类方法
类方法自然的是与类绑定,用classmethod装饰器装饰的方法。
@classmethod
def xiake(cls):
print('%s下课了' % cls.school)
cls实际上代表的就是类名,就像self代表的是实例化对象名一样,其和类绑定只能访问类的属性调用方法时使用**类名.方法名(参数…)也可以对象名.方法名(参数)**建议使用类名调用。
示例
class School:
school = 'hongqi'
def __init__(self, name, size, arrd):
self.name = name
self.size = size
self.arrd = arrd
def teach(self):
print('开始上课了')
@classmethod # 类方法和类绑定(只能访问类变量)
def xiake(cls):
print('%s下课了' % cls.school)
@staticmethod # 静态方法(类的工具包),不与对象绑定,也不与类绑定(不能使用类的变量,也不能使用对象的变量)
def area(width, height):
print('学校有%d大' % (width*height))
@property # 静态属性(用来封装逻辑)与实例对象绑定
def dizhi(self):
return self.size # 必须有返回值
p1 = School('myschool', 4000, '小古通街道811')
print(School.__dict__)
print(p1.__dict__)
School.xiake() # 类方法由类调用(建议使用)
p1.xiake() # 也可以由实例对象调用,不过这样做没神魔作用
School.area(100, 100) # 静态方法调用由类调用
p1.xiake(100, 100) # 对象调用也行
print(p1.dizhi) # 可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
运行后的结果和预期是一样的。
其中本文中提到的绑定的概念可以参考这个链接的博文
https://www.cnblogs.com/linhaifeng/articles/7341177.html