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__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

    朝闻道
  • 相关阅读:
    数据库事务的四大特性
    Mysql数据库的慢sql优化步骤
    数据库事务的4大隔离级别
    mysql的命令练习
    通过jedis对redis客户端的一些基本操作
    通过jedisPool写一个redis连接池
    jedis
    maven将本地jar包添加到本地仓库
    [Django学习] Django基础(7)_分类统计
    [Django学习] Django基础(6)_Field lookups
  • 原文地址:https://www.cnblogs.com/wander-clouds/p/8458115.html
Copyright © 2011-2022 走看看