一,属性:
属性:将一个方法伪装成一个属性,在代码的级别上没有本质的提升,但让其看起来更合理
property:是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
property一般用于类似于bmi,area,周长等需要计算的名词上
class Person: def __init__(self,name,hight,weight): self.name = name self.__hight = hight #私有化 self.__weight = weight def bmi(self): return '%s 的bmi 值%s' % (self.name, self.__weight / self.__hight ** 2) p1 = Person('张三',1.7,60) print(p1.bmi()) #结果:张三 的bmi 值20.761245674740486
使用@property
class Person: def __init__(self,name,hight,weight): self.name = name self.__hight = hight #私有化 self.__weight = weight @property def bmi(self): return '%s 的bmi 值%s' % (self.name, self.__weight / self.__hight ** 2) p1 = Person('张三',1.7,60) print(p1.bmi) #bmi方法伪装成属性 #结果:张三 的bmi 值20.761245674740486
属性的操作(增,改,删):
class Person: def __init__(self,name,age): self.name = name self.__age = age if type(age) is int else print('你输入的年龄的类型有误,请输入数字') @property def age(self): return self.__age @age.setter #改/增 def age(self,a1): self.__age = a1 if type(a1) is int 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__) #结果: 20 23 {'name': '张三'}
二.类方法(classmethod),静态方法(staticmethod)
类方法:通过类名调用的方法,类方法中第一个参数约定俗称是cls,python自动将类名(类空间)传给cls
类方法的应用场景:
1.类中有些方法不需要对象参与
class A: name = 'alex' count = 1 @classmethod def func1(cls): # 此方法无需对象参与 return cls.name + str(cls.count + 1) A.func1(111) #不可取 #a1 = A() #print(a1.func1()) print(A.func1()) #用类名调用cls得到的是类本身,所以不需要传参
2.对象中的静态变量进行改变,需要类方法
class A: age = 12 @classmethod def func(cls): cls.age = 22 #修改 print(cls.age) A.func() print(A.__dict__)
3.继承中父类得到子类的空间 可以做任意操作
class A: age = 12 @classmethod def func(cls): cls.age = 30 #将B类中的age改成30 也可删除增加任意操作 print(cls.age) #self 子类的对象,能得到子类空间的任意值 class B(A): age = 22 B.func() print(A.__dict__) print(B.__dict__)
静态方法:
class A: @staticmethod def func(username,password): if username == 'alex' and password == 123: print('登录成功') else: print('登录失败') A.func('alex',123)
作用:1.代码块,清晰
2.复用性