Python面向对象

类和实例

定义类

使用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__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus