Discuss / Python / 通过板砖学习大佬的编程思想,感谢大佬

通过板砖学习大佬的编程思想,感谢大佬

Topic source

#------------------------@property test2-------------------------

class screen(object):

    def __init__(self):

        self._resolution = 786432

    @property

    def width(self):

        return self._width

    @width.setter

    def width(self,value):

        if not isinstance(value,(int,float)):

            raise ValueError('bad width')

        self._width = value

    @property 

    def height(self):

        return self._height

    @height.setter

    def height(self,value):

        if not isinstance(value,(int,float)):

            raise ValueError('bad height')

        self._height = value

    @property

    def resolution(self):

        return self._resolution

# 测试:

s = screen()

s.width = 1024

s.height = 768

print('resolution =', s.resolution)

if s.resolution == 786432:

    print('测试通过!')

else:

    print('测试失败!')

#---------------------------------------------------------------

-Beiker

#2 Created at ... [Delete] [Delete and Lock User]

借楼:求大佬解答下:

class Screen(object):

    @property

    def width(self):

        return self.width

    @width.setter

    def width(self, value):

        self.width = value

    @property

    def height(self):

        return self.height

    @height.setter

    def height(self,value2):

        self.height = value2

    @property

    def resolution(self):

        return self.width * self.height

这样写测试就不通过,但是把width 和height声明为私有属性就能测试通过,为啥呢?下面这样就能测试通过,求解:

class Screen(object):

    @property

    def width(self):

        return self.__width

    @width.setter

    def width(self, value):

        self.__width = value

    @property

    def height(self):

        return self.__height

    @height.setter

    def height(self,value2):

        self.__height = value2

    @property

    def resolution(self):

        return self.__width * self.__height

要特别注意:属性的方法名不要和实例变量重名。例如,以下的代码是错误的:

class Student(object):

    # 方法名称和实例变量均为birth:
    @property
    def birth(self):
        return self.birth

这是因为调用s.birth时,首先转换为方法调用,在执行return self.birth时,又视为访问self的属性,于是又转换为方法调用,造成无限递归,最终导致栈溢出报错RecursionError

以上是原文的原话,多读几遍,然后对比你自己的代码


  • 1

Reply