python学习--类

97 阅读2分钟

通过__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的作用就是给一个类增加多个功能,