美文网首页
Python面向对象编程——实例属性和类属性

Python面向对象编程——实例属性和类属性

作者: SevenBy | 来源:发表于2018-02-12 00:14 被阅读16955次
  • 面向对象编程——实例属性和类属性
>>> class Student(object):
...     name = 'student'
...
>>> s = Student()  #创建实例
>>> print(s.name)  #打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
student
>>> print(Student.name)  #打印类的属性
student
>>> s.name = "Michael"  #给实例绑定name属性
>>> print(s.name)   #实例的属性比类的属性的优先级更高
Michael
>>> print(Student.name)   #但是类的属性并未消失,仍然可以访问
student
>>> del s.name   #删除实例的属性
>>> print(s.name)   #再次调用实例的属性,会从类中继承
student
  • 从上面的例子可以看出,在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉所有的类属性,但是当你删除掉实例属性后,再使用相同的名称,访问到的将是类属性。

  • 类的属性可以增删(del)改(重新赋值)查(getattr、dict、dir()、直接打印),实例的属性也可以增删改查,如果实在命令行中那只是临时的。但是不建议在外边随便改。


练习:

为了统计学生人数,给累增加一个属性,每创建一个自动加一:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__='byx54192@gmail.com'

class Student(object):
    count = 0
    def __init__(self, name):
        self.name = name
        Student.count+=1

if Student.count != 0:
    print('测试失败0')
else:
    bart = Student('Bart')
    if Student.count != 1:
        print('测试失败1!')
    else:
        lisa = Student('lisa')
        if lisa.count != 2:   #注意lisa实例并没有count属性,它就继续去class的count属性
            print('测试失败2!') 
        else:
            print('Students:', Student.count)
            print('测试通过!')

给实例绑定一个方法

class Student(object):
    pass
>>> 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 Student(object):
    pass
>>> s = Student()
>>> s.name = 'Michael' # 动态给实例绑定一个属性
>>> print(s.name)
Michael

PS: 给一个实例绑定的方法,对另一个实例是不起作用的

Python面向对象编程——实例属性和类属性

相关文章

网友评论

      本文标题:Python面向对象编程——实例属性和类属性

      本文链接:https://www.haomeiwen.com/subject/jxyqtftx.html