1. 程式人生 > >python3__面向物件__靜態方法 / 類方法 / 屬性方法 / 例項動態繫結屬性和方法 / 類動態繫結屬性和方法

python3__面向物件__靜態方法 / 類方法 / 屬性方法 / 例項動態繫結屬性和方法 / 類動態繫結屬性和方法

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)