python面度对象(属性,类方法,静态方法)
一. 属性
所谓的属性,就是将一个类中的方法伪装成一个属性.在代码的级别是没有任何本质上的提升.但是让代码看起来更顺眼.
property 装饰器函数,内置函数,帮助你将类中的方法伪装成属性(特性).
调用方法的时候不需要主动加括号
让程序的逻辑性更加合理
使用方法:
@porperty.setter 装饰器,修改被property装饰的属性的时候会调用被这个装饰器装饰过的方法,除了self之外还有一个参数:被修改的值
@property.deleter 装饰器,当要删除被property装饰的属性的时候回调用被这个装饰器装饰过的方法.
class Person: def __init__(self,name,age): self.name = name if type(age) is int: self.__age = age else: print( '你输入的年龄的类型有误,请输入数字') @property #属性的查看. 装饰器的用法 def age(self): return self.__age @age.setter #属性的修改 def age(self,a1): '''判断,你修改的年龄必须是数字''' if type(a1) is int: self.__age = a1 else: print('你输入的年龄的类型有误,请输入数字') @age.deleter #属性的删除 def age(self): del self.__age p1 = Person('帅哥',20) print(p1.age) p1.age = 23 #看上去更像是对某一个属性进行操作 print(p1.age) del p1.age print(p1.__dict__)
class Circle: def __init__(self,r): self.r = r @property def area(self): # 这个方法计算结果本身就是一个属性,但是这个属性会随着这个类/对象的一些基础变量的变化而变化(本身是一个运算过程,但伪装成了一个属性) return 3.14*self.r**2 c = Circle(5) print(c.area) c.r = 10 print(c.area)
二. 类方法
classmethod 类方法的装饰器 ,内置函数
使用类名调用,默认传类名作为第一个参数
不用对象命名空间中的内容,而用到了类命名空间中的变量(静态属性),或者类方法或静态方法
类方法:通过类名调用的方法,类方法中第一个参数约定俗成为cls, python自动将类名(类空间)传给cls.
class A: def func(self): # 普通方法 print(self) @classmethod # 类方法 def func1(cls): print(cls) a1 = A() a1.func() A.func(a1) A.func1() a1 = A() a1.func1() # 对象调用类方法,cls 得到的是类本身.
类方法的使用场景:
1. 类中有些方法不需要对象的参与时
class A: name = 'ale' count = 1 @classmethod def func1(cls): # 此方法无需对象参与 return cls.name + str(cls.count + 1) a1 = A() print(a1.func1()) print(A.func1())
2.对类中的静态变量进行改变.
3.继承中,父类得到子类的类空间.
也可以不通过类方法,让父类中的某个方法得到子类空间的任意值
class A: age = 12 def func2(self): print(self) # self 子类的对象,能得到子类 空间的任意值 class B(A): age = 22 b1 = B() b1.func2()
三. 静态方法
静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。事实上,在python引入静态方法之前,通常是在全局名称空间中创建函数
@staticmethod 装饰静态方法 内是函数
如果一个类里面的方法,即不需要用到self中的资源,也不用cls中的资源
相当于一个普通的函数
但是你由于某种原因,还要把这个方法方法放在类中,这个时候,就将这个方法变成一个静态方法
好处:
代码块清晰
提高复用性