1、定义类
在关键字class用来定义类,class后面是类名,紧接着是(object),表示该类是从那个类继承下来的。
>>> class Student(object):
... pass
...
>>>
2、类的属性
可以在类中的__init__
方法在创建类的实例的时候,把一些必要的属性填写进去。
>>> class Student(object):
... def __init__(self,name,age):
... self.name=name
... self.__age=age
...
建立实例变量:
>>> mike=Student("Mike",18)
其中self.__age=age
中的两个”下划线”表示这是类的私有变量,私有变量在类外是不能访问的。(在Python中,变量名类似xxx的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是私有变量),也有的变量前边是单下划线,这是保护变量。两者之间的区别为:
“单下划线” ,保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
“双下划线” ,私有变量,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
类的属性也可以在类的实例建立以后,动态添加。
>>> mike=Student("Mike",18)
>>> class Student(object):
... pass
...
>>> s=Student()
>>> s.name="Mike"
>>> s.name
'Mike'
除了动态的给对象添加变量,还可以给动态的添加方法
>>> def get_name(self):
... return self.name
...
>>> from types import MethodType
>>> s.get_name=MethodType(get_name,s,Student)
>>> s.get_name()
'Mike'
上述动态给类添加变量和方法只是给类的变量添加方法和变量,并没有对类的其它变量添加
>>> s1=Student()
>>> s1.name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'name'
>>> s1.get_name()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'get_name'
>>>
下面的第一行是给类添加方法,而不是给类的对象添加方法
>>> Student.get_name=MethodType(get_name,None,Student)
>>> s1.get_name()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in get_name
AttributeError: 'Student' object has no attribute 'name'
>>> s1.name="Tom"
>>> s1.get_name()
'Tom'
可以在类中使用__slots__
变量来限制class能够添加的变量
>>> class Student(object):
... __slots__=('name','age')
...
>>> s=Student()
>>> s.name='liu'
>>> s.name
'liu'
>>> s.age=18
>>> s.age
18
>>> s.score=18
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
>>>
__slots__
定义的属性仅在当前类起作用,对继承的子类不起作用,除非在子类中也定义类__slots__
,这样子类允许定义的属性就是当前的__slots__
加上父类的__slots__
。
3、变量的设置与获取
可以在类中写相应的get,set方法来设置,获取属性值。Python可以通过内置的@property
来把一个方法变成属性调用的。
class Student(object):
@property
def score(self):
return self.grade
@score.setter
def score(self,value):
if not isinstance(value,int):
print "typeError!"
if value<0 or value>100:
print "data is invalid!"
self.grade=value
s=Student()
s.score=90
print s.score
结果:
90
[Finished in 0.0s]
但是在Student类中,如果写成
class Student(object):
@property
def score(self):
return self.score
@score.setter
def score(self,value):
if not isinstance(value,int):
print "typeError!"
if value<0 or value>100:
print "data is invalid!"
self.score=value
则会报RuntimeError: maximum recursion depth exceeded
,上网差了一下,发现需要做本地化处理。self.score=value
会调用自身,形成递归。