Python 第七天

OOP

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。数据封装、继承和多态是面向对象的三大特点。

类和实例

1.类,是抽象的模板,类似于 ES5 中的构造函数,只不过在 Python 中,类是通过 class 关键字来定义的,习惯上,类名首字母大写:

#class 关键字后面是 类名,紧接着是小括号,里面表示从哪个类继承
class Student(object):
	pass

2.实例的创建很简单,就是类名加小括号,小括号里面可以添加类里面的参数

zx = Student()

3.类里面可以添加所有实例都拥有的属性。这是通过定义 init 方法来实现的

class Student(object):
	def __init__(self,name,score):
		self.name = name
		self.score = score

xf = Student('qxf',99)

print(xf.name)
print(xf.score)

4.数据封装,通过上面方法添加的属性可以直接通过类里面的方法进行访问。

class Student():
	def _init_(self,name,score):
		self.name = name
		self.score = score
	def show(self):
		print(self.name,'的成绩是',self.score)

qq = Student('jq',99)

qq.show()

访问限制

我们可以通过在属性名面前添加“__” 的方式来定义私有属性,私有属性不能通过实例对象直接访问

class NewObj():
	def __init__(self,name,score):
		self.__name = name
		self.__score = score

newZx = NewObj('zx',99)

#会报错
print(newZx.__name)

关于继承

当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。子类可以直接调用父类的方法。

class Animal():
	def __init__(self,name='Animal'):
		self.name = name
	def run(self):
		print(self.name)

class Cat(Animal):
	pass

cat = Cat('cat')
cat.run()			#cat

关于多态

当子类和父类都存在相同的run()方法时,我们说,子类的run()覆盖了父类的run(),在代码运行的时候,总是会调用子类的run()。这样,我们就获得了继承的另一个好处:多态。对于上面的代码,如果为子类添加一个新的 run 方法,代码调用的时候总会调用子类的方法。

class Cat(Animal):
	def run(self):
		print(r'run 什么 run')

cat = Cat('cat')
cat.run()		#run 什么 run

type(),isinstance(),dir(),getattr(),setattr(),hasattr()

1.type()函数可以判断对象类型,包括基本类型

type(123)		#<class "int">

2.isinstance() 函数判断类型是否为输入第二参数的类型,并返回布尔值

isinstance('a',str)			#true 

3.dir() 函数返回一个包含字符串的 list ,list 中包含被测对象的所有属性
4.getattr() 和 setattr() 可以直接操作一个对象的状态

getattr(obj,'x')		#获取 obj 的 'x' 属性,如果不存在会报错
getattr(obj,'x','default')	#可以通过添加额外一个参数来解决报错,如果不存在,返回 'default'
setattr(obj,'y',90)		#设置 obj 的 'y' 属性为 90

5.hasattr() 函数检测对象是否存在某方法,返回布尔值

slots

通过定义 slots 变量,我们可以限制 class 实例能够添加的属性

class Student(object):
	__slots__ = ('name')


Xf = Student()
Xf.score = 99			#会报错

@property

在绑定属性的时候,为了安全,我们会定义一些私有属性。比如我们需要检查更改数值是否正确的时候。我们可以使用 @property 来实现

#@property
class Student(object):
	def __init__(self,score = 60):
		self._score = score

	@property
	def score(self):
		return self._score

	#使用@property会生成另外一个监视器@***.setter 。用以实现重新赋值操作
	@score.setter
	def score(self,val):
		if not isinstance(val,int):
			raise ValueError('score must be an integer')
		if val < 0 or val > 100:
			raise ValueError('score must between 0-100')

		self._score = val


a = Student(90)
print(a.score)
#a.score = 9999 		#报错

多重继承

一个子类可以继承多个父类,继承之间存在顺序

class Student(object):
	pass

class Child(object):
	pass

class Boy(Child,Student):
	pass

# Boy 继承 Child 和 Student 的属性和方法,有同名时顺序为 Boy-Child-Student
posted @ 2017-08-18 18:01  我是一个毛毛虫  阅读(163)  评论(0)    收藏  举报