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

 

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