属性,类方法,静态方法,反射
?
1.屬性 @property
2.類(lèi)方法 @classmethod
3.靜態(tài)方法? @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)
屬性:將方法偽裝成屬性雖然在代碼層面上沒(méi)有任何高深之處,但是讓其看起來(lái)更合理.
屬性的改和刪除
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
更改屬性,一共進(jìn)行了兩步操作:
第一步:對(duì)屬性進(jìn)行改操作自動(dòng)執(zhí)行,被這個(gè)@weight.setter裝飾器裝飾的方法.
第二步:將新值傳給被@weight.setter裝飾器裝飾的方法里面,當(dāng)做參數(shù)
print(a.weight)
print(a.bmi)
del a.weight
print(a.weight) #因?yàn)閟elf.__weight被刪除了,找不到self.__weight,所進(jìn)行到這一步會(huì)報(bào)錯(cuò).
刪和改一樣的運(yùn)行步驟.
2.類(lèi)方法@classmethod
class? A:
__name = "武大"
def func(self):
print("in? ?a")
@classmethod
def func1(cls):
print(cls,"in? ? b")
a1 = A()
a1.func1()
A.func1()
類(lèi)名去調(diào)用類(lèi)方法,自動(dòng)將類(lèi)的空間傳給類(lèi)方法中的cls(在Python中約定俗成這么寫(xiě))
對(duì)象如果調(diào)用類(lèi)方法,自動(dòng)將類(lèi)空間傳給類(lèi)中的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")
什么情況下使用類(lèi)方法?
直接讓類(lèi)去操作類(lèi)中的方法,沒(méi)有必要?jiǎng)?chuàng)建對(duì)象再操作的時(shí)候用類(lèi)方法.
3.靜態(tài)方法:@staticmethod
靜態(tài)方法:在類(lèi)中定義一個(gè)靜態(tài)方法,無(wú)需傳入類(lèi)空間,對(duì)象空間,可以當(dāng)普通函數(shù)取用.
class A:
@staticmethod
def func(username,password):
print(555555)
a = A()
a.func()
A.func()
4.反射:通過(guò)字符串操作一個(gè)空間(對(duì)象)
反射針對(duì)的是拿到的是一個(gè)字符串類(lèi)型,然后對(duì)這個(gè)類(lèi)進(jìn)行操作.
反射共有四種方法:
getattr() : 從對(duì)象中得到這個(gè)屬性對(duì)應(yīng)的值.
hasattr() : 判斷此對(duì)象中,有沒(méi)有這個(gè)屬性.
setattr() : 對(duì)一個(gè)對(duì)象或者類(lèi)設(shè)置(增加或者改)屬性? ??
delattr() : 刪除對(duì)象或者類(lèi)屬性
我們從四個(gè)方面來(lái)觀(guān)察反射:
1.實(shí)例化一個(gè)對(duì)象研究:
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")) #從對(duì)象中得到這個(gè)屬性對(duì)應(yīng)的值
print(hasattr(a,"sex")) #判斷此對(duì)象中,有沒(méi)有這個(gè)屬性.
setattr(a,"height",180)? ? ? #對(duì)一個(gè)對(duì)象設(shè)置(增加或者改)屬性
delattr(a,"sex") #對(duì)一個(gè)對(duì)象屬性刪除,不可刪除和修改
2.在類(lèi)中研究:
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(模塊名,"變量名/函數(shù)名/類(lèi)名等")
4.在本模塊(本文件)去研究:
import? sys?? #引入本模塊
print(getattr(sys.modules[__name__],"變量名/函數(shù)名/類(lèi)名等")
?
轉(zhuǎn)載于:https://www.cnblogs.com/fengkun125/p/9260424.html
總結(jié)
以上是生活随笔為你收集整理的属性,类方法,静态方法,反射的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android修改系统时系统黑屏时不进入
- 下一篇: nth-of-type(n)