zoukankan      html  css  js  c++  java
  • python 类属性及限制


    Student类本身需要绑定一个属性
    直接在class中定义属性,这种属性是类属性,归Student类所有:
    class Student(object):
    name = 'Student'
    类的所有实例都可以访问到类属性
    >>> s = Student() # 创建实例s
    >>> print(s.name)
    Student
    # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
    >>> s.name = 'Michael' # 给实例绑定name属性
    >>> print(s.name)
    Michael
    # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性

    相同名称的实例属性将屏蔽掉类属性

    给实例绑定一个方法
    >>> def set_age(self, age): # 定义一个函数作为实例方法
    ... self.age = age
    ...
    >>> from types import MethodType
    >>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
    >>> s.set_age(25) # 调用实例方法
    >>> s.age # 测试结果
    25
    给一个实例绑定的方法,对另一个实例是不起作用的

    可以给class绑定方法:

    >>> def set_score(self, score):
    ... self.score = score
    ...
    >>> Student.set_score = set_score

    限制实例的属性
    使用__slots__
    只允许对Student实例添加name和age属性
    class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

    >>> s = Student() # 创建新的实例
    >>> s.name = 'Michael' # 绑定属性'name'
    >>> s.age = 25 # 绑定属性'age'
    >>> s.score = 99 # 绑定属性'score'
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    AttributeError: 'Student' object has no attribute 'score'
    由于'score'没有被放到__slots__中,所以不能绑定score属性

    __slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

    朝闻道
  • 相关阅读:
    安装selenium
    虚拟机安装Linux系统
    Pycharm安装+python安装+环境配置
    shell命令
    单例模式
    装饰者模式
    AtomicInteger的CAS原理
    J.U.C总览图
    锁机制(四)
    锁机制(三)
  • 原文地址:https://www.cnblogs.com/wander-clouds/p/8458115.html
Copyright © 2011-2022 走看看