面向对象编程——实例属性和类属性
>>> 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: 给一个实例绑定的方法,对另一个实例是不起作用的
图片发自简书App