1.属性 @property
2.类方法 @classmethod
3.静态方法 @staticmethod
4.反射
1.属性:
class A:
__name = "武大"
def __init__(self,name,weight,height):
self.name = name
self.__weight = weigh
self.height = height
def bmi(self):
return self.__weight/height**2
a = A("alex",70,1.8)
print(a.bmi())
class A:
def __init__(self,name,weight,height):
self.name = name
self.__weight = weight
self.height = height
@property
def bmi(self):
return self.__weight/height**2
a = A("alex",70,1.8)
print(a.bmi)
属性:将方法伪装成属性虽然在代码层面上没有任何高深之处,但是让其看起来更合理.
属性的改和删除
class A:
def __init__(self,name,weight,height):
self.name = name
self.__weight = weight
self.height = height
@property
def bmi(self):
return self.__weight/height**2
@property
def weight(self):
return self.__weight
@weight.setter
def weight(self,new_weight):
self.__weight = new_weight
@weight.deleter
def weight(self):
del self.__weight
a = A("alex",70,1.8)
print(a.bmi)
print(a.weight)
a.weight = 80
更改属性,一共进行了两步操作:
第一步:对属性进行改操作自动执行,被这个@weight.setter装饰器装饰的方法.
第二步:将新值传给被@weight.setter装饰器装饰的方法里面,当做参数
print(a.weight)
print(a.bmi)
del a.weight
print(a.weight) #因为self.__weight被删除了,找不到self.__weight,所进行到这一步会报错.
删和改一样的运行步骤.
2.类方法@classmethod
class A:
__name = "武大"
def func(self):
print("in a")
@classmethod
def func1(cls):
print(cls,"in b")
a1 = A()
a1.func1()
A.func1()
类名去调用类方法,自动将类的空间传给类方法中的cls(在Python中约定俗成这么写)
对象如果调用类方法,自动将类空间传给类中的cls.
class A:
__name = "wusir"
def func(self,new_name):
A.__name = new_name
return A.__name
@classmethod
def func1(cls,new_name):
A.__name = new_name
return A.__name
a2 = A()
print(a2.func1("alex"))
print(A.func1("alex"))
print(A,func(22,"alex")
什么情况下使用类方法?
直接让类去操作类中的方法,没有必要创建对象再操作的时候用类方法.
3.静态方法:@staticmethod
静态方法:在类中定义一个静态方法,无需传入类空间,对象空间,可以当普通函数取用.
class A:
@staticmethod
def func(username,password):
print(555555)
a = A()
a.func()
A.func()
4.反射:通过字符串操作一个空间(对象)
反射针对的是拿到的是一个字符串类型,然后对这个类进行操作.
反射共有四种方法:
getattr() : 从对象中得到这个属性对应的值.
hasattr() : 判断此对象中,有没有这个属性.
setattr() : 对一个对象或者类设置(增加或者改)属性
delattr() : 删除对象或者类属性
我们从四个方面来观察反射:
1.实例化一个对象研究:
class A:
name = "alex"
def __init__(self,age,sex):
self.__age = age
self.sex = sex
def func(self):
print(33333)
a = A(23,"女")
print(getattr(a,"name")) #从对象中得到这个属性对应的值
print(hasattr(a,"sex")) #判断此对象中,有没有这个属性.
setattr(a,"height",180) #对一个对象设置(增加或者改)属性
delattr(a,"sex") #对一个对象属性删除,不可删除和修改
2.在类中研究:
class A:
name = "wusir"
def func(self):
print(6666)
print(getattr(A,name))
print(hasattr(A,func))
setattr(A,"sex","女")
delattr(A,"name)
3.在其他模块去研究:
import 模块名 #引入模块
print(getattr(模块名,"变量名/函数名/类名等")
4.在本模块(本文件)去研究:
import sys #引入本模块
print(getattr(sys.modules[__name__],"变量名/函数名/类名等")