实例属性和类属性

实例属性通过self或实例变量来定义,注意__init__方法中定义的是实例属性:

class Student(object):
    def __init__(self, name):
        self.name = name

s1 = Student(‘Bob‘)
#给实例添加一个属性
s1.score = 90

s2 = Student(‘Jim‘)

在实例s1中添加一个属性score, 该属性只对s1有用,在s2中是没有的:

>>> s1.score
90
>>> s2.score
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘Student‘ object has no attribute ‘score‘

类属性是怎么定义的呢?

class Student(object):
    name = ‘Student‘

当我们定义一个类属性后,这个属性归类所有,所有的实例都可以访问它:

>>> s1 = Student()
>>> s2 = Student()
>>> s1.name, s2.name
(‘Student‘, ‘Student‘)

现在修改一个s1的name, 会出现什么情况呢?

>>> s1.name = ‘windows‘
>>> s1.name
‘windows‘
>>> s2.name
‘Student‘

再删除s1的那么属性:

>>> del s1.name
>>> s1.name
‘Student‘

也可以删除类的属性,类属性删除后,所有实例都将不能访问该属性了:

>>> del Student.name
>>> s1.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘Student‘ object has no attribute ‘name‘
>>> s2.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘Student‘ object has no attribute ‘name‘

同样的,也可以给实例和类绑定一个方法:

class Student(object):
    pass

def set_age(self, age): # 定义一个函数作为实例方法
     self.age = age

>>> s = Student()
>>> from types import MethodType
>>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
>>> s.set_age(25) # 调用实例方法
>>> s.age # 测试结果
25

给实例绑定的方法,对另一个实例是不生效的;如果要给所有实例绑定方法,可以在类上绑定:

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

Student.set_score = set_score

给类绑定方法后,所有的实例都可以访问;一般情况下,方法可以直接写在类中,但动态绑定允许程序在运行过程中动态添加功能。

但有时候我们不希望对实例随意添加属性或方法,比如我们希望只允许对实例添加age和name属性;Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:

class Student(object):
    __slots__ = (‘name‘, ‘age‘) # 用tuple定义允许绑定的属性名称

但要注意的是,__slots__只对当前类实例起作用,对子类是不起作用的;除非在子类中也定义__slots__; 这样子类允许定义的属性就是子类__slots__ + 父类__slots__



如果在Student类中有个score属性,那么通过Student.score来访问的时候,就暴露了score属性;知道了score属性,就可以随意对它进行修改,而且不能进行正确性检测,比如把成绩修改成abc,显然是不合适的,要解决这个问题,可以设置一个方法get_score()来获取成绩, set_score()来设置成绩:

class Student(object):

    def get_score(self):
         return self._score

    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError(‘score must be an integer!‘)
        if value < 0 or value > 100:
            raise ValueError(‘score must between 0 ~ 100!‘)
        self._score = value

那有没有办法通过Student.score来访问,又有正确性检测呢?  那就需要用到@property装饰器,来把方法变成属性:

class Student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError(‘score must be an integer!‘)
        if value < 0 or value > 100:
            raise ValueError(‘score must between 0 ~ 100!‘)
        self._score = value

这样就可以像属性一样操作了:

>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!
时间: 2024-10-11 23:29:22

实例属性和类属性的相关文章

python 之实例属性和类属性

由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(self, name): self.name = name s = Student('Bob') s.score = 90 但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有: class Student(object): name

【Python】[面性对象编程] 获取对象信息,实例属性和类属性

获取对象信息1.使用isinstance()判断class类型2.dir() 返回一个对象的所有属性和方法3.如果试图获取不存在的对象会抛出异常[AttributeError]4.正确利用对象内置函数的例子: def readImage(fp): if hasattr(fp,"read"): return readData(fp) return None 实例属性和类属性1.一句话,Python是动态语言,根据类创建的实例可以任意绑定属性.    注意:实例属性和雷属性的名字要保持不一

面向对象编程——实例属性和类属性(六)

由于python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(self,name): self.name = name s = Student('Bob') #添加实例 s.score = 90 #添加属性 但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有: >>> class St

Python day 8(4) 实例属性和类属性

1 由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(self, name): self.name = name s = Student('Bob') s.score = 902 如果Student类本身需要绑定一个属性,可以直接在class中定义属性,这种属性是类属性,归Student类所有: class Student(object): name

面向对象编程(实例属性、类属性)

由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(self, name): self.name = name s = Student('Bob') s.score = 90 但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有: class Student(object): name

Python实用笔记 (22)面向对象编程——实例属性和类属性

由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(self, name): self.name = name s = Student('Bob') s.score = 90 但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有: class Student(object): name

python中类对象、实例对象、类属性、实例属性、类方法、实例方法、静态方法

类对象.类属性与实例对象.实例属性的区别 在Python中一切皆是对象,类是一个特殊的对象即类对象,描述类的属性称为类属性.类属性在内存中只有一份,在__init__外部定义. 通过类创建的对象称为实例对象,描述实例对象的属性称为实例属性.实例属性在各自对象的内存中都保存一份,在__init__方法内部定义. 实例方法.类方法.静态方法的区别 这三种方法都是保存在类的内存中,调用者不同. 实例方法由对象调用,至少一个self参数,self代表对象的引用. 类方法有类调用,至少一个cls参数,并且

python0.16------构造函数/析构函数/self详解/重写/访问限制/对象属性和类属性/@property/运算符重载

构造函数:__init__()引子:因为每个人一出生都是不一样的.因此,如果在Person类中直接给类元素赋值有问题,它会导致每个人的初始状态相同,这不符合大自然的逻辑.应该根据每个人的特点,给每个出生的人不一样的特性.可以通过构造函数实现这个想法.__init__()函数在使用类创建对象自动调用.注意:如果不显式写出构造函数,默认会添加一个空的构造函数. 使用构造函数:def __init__(self,name,age,height,weight):#一般定义属性在构造函数里面定义. sel

python 对象属性与类属性

class Person(object): # 这里的属性实际上属于类属性(用类名来调用) name = "person" def __init__(self, name): pass #对象属性 self.name = name print(Person.name)per = Person("tom")#对象属性的优先级高于类属性print(per.name)#动态的给对象添加对象属性per.age = 18#只针对于当前对象生效,对于类创建的其他对象没有作用pr