通过__init__方法来设置类的属性并绑定到self上,self只想的是创建的实例本身。
对于class来说,有属性和方法,外部代码可以直接调用实例的方法来操作数据,如果要让内部属性不被外部访问,可以把属性名称前加上两个下划线__变成私有变量
>>> class Student(object):
... def __init__(self,name,score):
... self.__name=name
... self.__score=score
... def print_score(self):
... print('%s: %s' %(self.__name,self.__score))
...
>>> bart=Student('Bart',59)
>>> bart.__name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'
如此将无法从外部获取变量,可以通过get_name方法获取变量。 在python中__xx__的变量是特殊变量,是可以直接被访问的。还有一个下划线的变量_name,这种实例变量是可以被外部访问的,但是按照约定,请将此看作内部变量对待。
#定义class
class Student(object):
pass
s=Student()
s.name='Summer' #动态给实例绑定变量
print(s.name)
def set_age(self,age):
self.age=age
#给实例绑定方法,只对当前实例有效,对于一个新的实例没用
from types import MethodType
s.set_age=MethodType(set_age,s)
s.set_age(25)
print(s.age)
可以通过给class绑定方法使所有的实例都可以调用
def set_score(self, score):
self.score=score
Student.set_score = set_score
s.set_score(100)
print(s.score)
s2=Student()
s2.set_score(99)
print('score of s2 is %s' %(s2.score))
可以使用__slots__限制class能添加的属性,如果绑定不存在的属性就会报错AttributeError
>>> class Student(object):
... __slots__=('name','age')
...
>>> s=Student()
>>> s.age=25
>>> print(s.age)
25
>>> s.name='Summer'
>>> print(s.name)
Summer
>>> s.score=99
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
>>> print(s.score)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
注意__slots__类属性限制只对当前的类有效,对于子类无效,除非子类也有__slots__的限制,如果父类和子类都有__slots__的限制,则子类能动态定义的属性为父类和子类的__slots__的并集
>>> class GraduateStudent(Student):
... pass
...
>>> g=GraduateStudent()
>>> g.score=10
>>> print(g.score)
10
多重继承
MixIn的作用就是给一个类增加多个功能,