Discuss / Python / @property确实好,看起来更加符合面向对象

@property确实好,看起来更加符合面向对象

Topic source

久疤_796

#1 Created at ... [Delete] [Delete and Lock User]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'使用@property'

__author__ = 'HZF'

'''
get/set设置属性的调用方法又略显复杂,没有直接用属性这么直接简单。
有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?对于追求完美的Python程序员来说,这是必须要做到的!
还记得装饰器(decorator)可以给函数动态加上功能吗?对于类的方法,装饰器一样起作用。Python内置的@property装饰器就是负责把一个方法变成属性调用的:
'''

class Stu(object):
    def __init__(self,name,age=0):
        self.name = name
        self.age = age
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self,name):
        if not isinstance(name,str):
            raise ValueError('name must be a string!')
        if len(name)<2 or len(name)>16:
            raise ValueError('name\'s length must between 2 and 16!')
        self.__name = name
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self,age):
        if not isinstance(age,int):
            raise ValueError('age must be an integer!')
        if age<0 or age>150:
            raise ValueError('age must between 0 and 150!')
        self.__age = age
    @property
    def info(self):
        return [self.name,self.age]

s1 = Stu('Lili')
#s2 = Stu('Miao',-5)
s2 = Stu('Miao',5)
s3 = Stu('Ming',0)
s4 = Stu('Xiao',25)
s5 = Stu('刘凯',30)

S = [s1,s2,s3,s4,s5]
for i in S:
    print(i.info)

class Screen():
    def __init__(self,width,height):
        self.width = width
        self.height = height
    @property
    def width(self):
        return self.__width
    @width.setter
    def width(self,width):
        if not isinstance(width,int):
            raise ValueError('width must be an integer!')
        if width<0:
            raise ValueError('width must not less than 0!')
        self.__width = width
    @property
    def height(self):
        return self.__height
    @height.setter
    def height(self,height):
        if not isinstance(height,int):
            raise ValueError('height must be an integer!')
        if height<0:
            raise ValueError('height must not less than 0!')
        self.__height = height
    @property
    def resolution(self):
        return self.width * self.height
    @property
    def info(self):
        return [self.width,self.height]

s = Screen(1366,768)
print(s.info,s.resolution)

assert s.width>s.height,'width:%s <= height:%s'%(s.width,s.height)

  • 1

Reply