python3__面向物件__靜態方法 / 類方法 / 屬性方法 / 例項動態繫結屬性和方法 / 類動態繫結屬性和方法
阿新 • • 發佈:2018-11-09
0.普通方法
普通方法訪問類屬性:self.__class__.類屬性名稱
class Test(object): n = 123 def __init__(self, n): self.n = n def tell(self): # 呼叫類變數 print("類n: %s" % self.__class__.n) print("例項n: %s" % self.n) if "__main__" == __name__: t1 = Test(456) t1.tell()
1.靜態方法
①靜態方法是類中的函式,不需要例項
②主要用來存放邏輯性的程式碼,與類本身沒有互動,即在靜態方法中不會涉及到類內的方法和屬性若想呼叫類內的方法和屬性則可通過(__class__.類屬性)
③形式:新增@staticmethod裝飾器
④呼叫:類名 或 例項
import time class TimeTest(object): n = 100 def __init__(self, hour, minute, second): self.hour = hour self.minute = minute self.second = second @staticmethod def showTime(): print(__class__.n) return time.strftime("%H:%M:%S", time.localtime()) if "__main__" == __name__: t = TimeTest(12, 23, 45) t.showTime() TimeTest.showTime()
2.類方法
①將類本身作為物件進行操作的方法
②與類方法的區別:不管是例項呼叫還是類呼叫,第一個傳入的物件都是類
③cls即為類自身
④只能訪問類變數,不能訪問例項變數
⑤可以通過例項 / 類 進行呼叫
class ClassTest(object): __num = 0 @classmethod def addNum(cls): cls.__num += 1 @classmethod def getNum(cls): print(cls.__num) # 魔術函式:建立例項的時候呼叫人數累加的函式 def __new__(cls, *args, **kwargs): ClassTest.addNum() return super(ClassTest, cls).__new__(cls) class Student(ClassTest): def __init__(self, name=""): self.name = name if "__main__" == __name__: s1 = Student("1") s3 = Student("3") ClassTest.getNum() s3.getNum()
3.屬性方法
在面向物件程式設計中,經常會將對某個屬性(為了安全設定成私有屬性)的操作封裝成某些函式。而@property正是通過裝飾器,將類內部進行屬性操作的函式設定成“屬性”的形式進行呼叫。
class Score(object):
def __init__(self, name, score):
self.name = name
self.__score = score
@property
def score(self):
print(self.__score)
@score.setter
def score(self, score):
if score < 0 or score > 100:
raise ValueError("invalid score")
self.__score = score
# # error
# @property
# def set_score(self, score):
# if score < 0 or score > 100:
# raise ValueError("invalid score")
# self.__score = score
#
# @property
# def get_score(self):
# print(self.__score)
if "__main__" == __name__:
s1 = Score("maxin", 91)
s1.score # 91
s1.score = 95
s1.score # 95
4.例項(屬性、方法的繫結)和類(屬性、方法的繫結)
python作為一種動態語言,允許對傳入的例項進行例項和方法的繫結,對屬性的繫結比較簡單,對方法的繫結需要通過from types import MethodType 的形式,告訴直譯器s.set_age的方法操作是將set_age函式繫結s 即 s.set_age = MethodType(set_age, s) ,這樣python就知道怎樣執行s的set_age方法
class Student(object):
pass
def set_age(self, age):
self.age = age
def set_score(self, score):
self.score = score
if "__main__" == __name__:
# 例項:動態繫結屬性
s1 = Student()
s1.name = "maxin"
print(s1.name)
# 例項:動態繫結方法
from types import MethodType
s1.set_age = MethodType(set_age, s1)
s1.set_age(35)
print(s1.age)
# 類:動態方法繫結
Student.set_score = set_score
s2 = Student()
# s2.set_age(22) # error
s1.set_score(90)
s2.set_score(78)
print(s1.score, s2.score)
# 類:動態屬性繫結
Student.name = "maxin"
s3 = Student()
s4 = Student()
s3.__class__.name = "limingyue"
print(s3.name, s4.name)