类和实例
定义类
使用class
关键字
class Student(object): #class 类名(继承类) 无继承类则使用object,也可省略
"""docstring for Student"""
def __init__(self, name, score):
#初始属性,第一个参数永远是self,表示创建的实例本身
super (Student, self).__init__()
self.name = name
self.score = score
def print_score(self)
print('%s: %s' % (self.name, self.score))
实例化
类名+()
>>> bob = Student('Bob', 98)
>>> bob.print_score()
Bob: 98
创建实例后,可以自由地给一个实例变量绑定属性,如
>>> bob.school = 'SWUST'
>>> bob.school
'SWUST'
访问限制
- private私有变量:变量名以
__
开头 注意:__name__
外部可以访问,是特殊变量
继承和多态
基类:
class Animal(object):
def run(self):
print('Animal is running...')
子类:
class Dog(Animal)
pass
子类调用父类方法:
>>> dog = Dog()
>>> dog.run()
Animal is running...
同样支持多态
动态语言
对于动态语言,传入时不一定需要Animal
类型,只需要保证传入的对象有run()
方法即可
获取对象信息
使用type()
>>> type(123)
<class 'int'>
使用isinstance()
>>> a = 10
>>> isinstance(a, int)
True
>>> isinstance(a, float)
False
使用dir()
获得一个对象的所有属性和方法,它返回一个包含字符串的list
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
类似__xxx__
的属性和方法在Python中都是有特殊用途的,比如__len__
方法返回长度。在Python中,如果你调用len()
函数试图获取一个对象的长度,实际上,在len()
函数内部,它自动去调用该对象的__len__()
方法
限制类的实例绑定属性
在定义时,定义一个特殊的__slots__
变量来限制实例能添加的属性
class Student(object):
__slots__ = ('name', 'age') #用tuple定义允许绑定的属性名称
尝试绑定
>>> s = Student()
>>> s.name = 'Michael'
>>> s.score = 99 #绑定属性'score'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
由于'score'
没有被放到__slots__
中,所以不能绑定score
属性,试图绑定score
将得到AttributeError
的错误。
使用__slots__
要注意,__slots__
定义的属性仅对当前类实例起作用,对继承的子类是不起作用的