python之類的成員(屬性)

class Foo:

    def __init__(self):
        self.name = 'a'

    # obj.bar()
    def bar(self):
        # self是對象
        print('bar')

    @property
    def per(self):
        print('123')
        return 1


obj = Foo()
r = obj.per  # 123  在定義時像方法,在訪問時像字段
print(r)  #  1

如果在per中只有一條語句return 1,那麼per就是一個屬性。

class Foo:

    def __init__(self):
        self.name = 'a'

    # obj.bar()
    def bar(self):
        # self是對象
        print('bar')

    @property
    def per(self):
        return 1


obj = Foo()
r = obj.per  # 123  在定義時像方法,在訪問時像字段
print(r)  # 1

 如果想要給obj.per賦值,需要增加一個函數。(如果直接obj.per=123,會報錯AttributeError: can't set attribute)

class Foo:

    def __init__(self):
        self.name = 'a'

    # obj.bar()
    def bar(self):
        # self是對象
        print('bar')

    # 用於執行obj.per
    @property
    def per(self):
        return 1

    # 用於執行obj.per = 123
    @per.setter
    def per(self, val):
        print(val)

    @per.deleter
    def per(self):
        print('666')

obj = Foo()
r = obj.per  # 123  在定義時像方法,在訪問時像字段
print(r)  # 1
obj.per = 123  # 123
del obj.per

del obj.per並不是真正地刪除了obj.per,該語句所做的是在@per.deleter裏對應的代碼。正如上述代碼中的del obj.per所做的就是打印了666。

 

舉個栗子:

li = []
for i in range(1000):
    li.append(i)

while True:
    p = input('請輸入要查看的頁碼:')
    p = int(p)
    start = (p-1)*10
    end = p*10
    print(li[start:end])

這是沒用屬性的代碼,只用了方法 

class Pergination:
    def __init__(self, current_page):
        try:
            self.page = int(current_page)
        except Exception as e:
            self.page = 1


    def start(self):
        return (self.page-1)*10

    def end(self):
        return self.page*10


li = []
for i in range(1000):
    li.append(i)

while True:
    p = input('請輸入要查看的頁碼:')
    obj = Pergination(p)
    print(li[obj.start():obj.end()])

用了屬性的代碼(屬性的作用就是爲了去掉調用時的括號)

class Pergination:
    def __init__(self, current_page):
        try:
            self.page = int(current_page)
        except Exception as e:
            self.page = 1

    @property
    def start(self):
        return (self.page-1)*10
    @property
    def end(self):
        return self.page*10


li = []
for i in range(1000):
    li.append(i)

while True:
    p = input('請輸入要查看的頁碼:')
    obj = Pergination(p)
    print(li[obj.start:obj.end])

屬性的另一種表達方式

class Foo:

    def f1(self):
        return 123

    def f2(self, v):
        print(v)

    def f3(self):
        print('del')

    per = property(fget=f1, fset=f2, fdel=f3)


    # 上述代碼等價於
    # @property
    # def per(self):
    #     return 123

obj = Foo()
ret = obj.per
print(ret)
obj.per = 123456
del obj.per

# 123
# 123456
# del

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章