• python中类的概念


    在Python中,所有数据类型都可以视为对象,也可以自定义对象。自定义的对象即面向对象中的类(Class)的概念。

    1 class Student(object):
    2 
    3     def __init__(self, name, score):
    4         self.name = name
    5         self.score = score
    6 
    7     def print_score(self):
    8         print('%s: %s' % (self.name, self.score))

    注意:__init__方法的第一个参数永远是self,表示创建的实例本身。

    因此在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。

    如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__。

    在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。

    所以,我们把Student类改一改:

    1 class Student(object):
    2 
    3     def __init__(self, name, score):
    4         self.__name = name
    5         self.__score = score
    6 
    7     def print_score(self):
    8         print('%s: %s' % (self.__name, self.__score))

    改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:

    1 >>> bart = Student('Bart Simpson', 98)
    2 >>> bart.__name
    3 Traceback (most recent call last):
    4   File "<stdin>", line 1, in <module>
    5 AttributeError: 'Student' object has no attribute '__name'

    由于Python是动态语言,根据类创建的实例可以任意绑定属性。给实例绑定属性的方法是通过实例变量,或者通过self变量:

    1 class Student(object):
    2     def __init__(self, name):
    3         self.name = name
    4 
    5 s = Student('Bob')
    6 s.score = 90
     1 //@property使用方法
     2 class Student(object):
     3 
     4     def get_score(self):
     5          return self._score
     6 
     7     def set_score(self, value):
     8         if not isinstance(value, int):
     9             raise ValueError('score must be an integer!')
    10         if value < 0 or value > 100:
    11             raise ValueError('score must between 0 ~ 100!')
    12         self._score = value

    现在,对任意的Student实例进行操作,就不能随心所欲地设置score了:

    1 >>> s = Student()
    2 >>> s.set_score(60) # ok!
    3 >>> s.get_score()
    4 60
    5 >>> s.set_score(9999)
    6 Traceback (most recent call last):
    7   ...
    8 ValueError: score must between 0 ~ 100!

    使用后的变化:

     1 class Student(object):
     2     @property
     3     def score(self):
     4         return self._score
     5 
     6     @score.setter
     7     def score(self, value):
     8         if not isinstance(value, int):
     9             raise ValueError('score must be an integer!')
    10         if value < 0 or value > 100:
    11             raise ValueError('score must between 0 ~ 100!')
    12         self._score = value

    @property的实现比较复杂,我们先考察如何使用。

    把一个getter方法变成属性,只需要加上@property就可以了。此时@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值。

    于是,我们就拥有一个可控的属性操作:

    1 >>> s = Student()
    2 >>> s.score = 60 # OK,实际转化为s.set_score(60)
    3 >>> s.score # OK,实际转化为s.get_score()
    4 60
    5 >>> s.score = 9999
    6 Traceback (most recent call last):
    7   ...
    8 ValueError: score must between 0 ~ 100!

    注意到这个神奇的@property,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。

  • 相关阅读:
    framework7 底部弹层popup js关闭方法
    div动画旋转效果
    面试题3
    面试题2
    CORS跨域请求[简单请求与复杂请求]
    面试题1
    nginx
    Pycharm配置支持vue语法
    Ajax在jQuery中的应用---加载异步数据
    jQuery开发入门
  • 原文地址:https://www.cnblogs.com/jfl-xx/p/7295448.html
Copyright © 2020-2023  润新知