python中的面向对象及特征(封装,继承,多态)

面向对象与面向过程的区别:

面向过程——步骤化

  • 面向过程就是分析出实现需求所需要的步骤,通过函数(方法)一步一步实现这些步骤,接着依次调用即可。

面向对象——行为化

  • 面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成类(类实例化后才是对象),创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为。

类和对象:

1、什么是类? -------  类别 关键字 class 进行定义类 2、对象  -------  类的实例,是一个真实存在的事物 3、定义的类: 通过class 关键字定义,类里面可以包含属性 4、类名的命名规范:遵循大驼峰法 user_name UserName 代码演示:
class User(object):
	def __init__(self,name,age,gender):
		self.name = name
		self.age = age
		self.gender = gender

	def study(self):
		print("阿文爱学习!!")
		print("i'm " +self.name+ " love study!")

	def __str__(self):
		return "[name = "+self.name+",age = "+self.age+",gender = "+self.gender+"]"

if __name__ == '__main__':
	u = User("zhangsan","18","boy")#构建对象时将属性写入对象之中
	print(u)
	print(u.name)
	u.study()

解释:只要在类中定义了__str__(self)方法,那么当使用print打印实例对象的时候,就会直接打印出在这个方法中return的数据。这就是这个方法的好处,你可以利用这个方法的返回值直接打印对象。

面向对象的三大特征:封装,继承,多态

1、封装

面向对象的封装特指的是将属性和方法封装到一个类或者多个类中,在需要使用的时候,通过对象 调用对用的方法或者属性。 隐藏对象的属性和实现细节,仅对外提供公共访问方式。

【好处】 1. 将变化隔离; 2. 便于使用;3. 提高复用性; 4. 提高安全性;

【封装原则】1. 将不需要对外提供的内容都隐藏起来;2. 把属性都隐藏,提供公共方法对其访问。

第一种方法:get和set方法

class User(object):
	def __init__(self,username,age,gender):
		self.__username = username #__username表示将属性username私有化
		self.__age = age
		self.__gender = gender

	def __str__(self):
		return "name:"+self.__username+" 年龄:"+self.__age+" 性别:"+self.__gender+""
	#get方法
	def get_username(self): #通过get方法访问私有属性
		return self.__username
	#set方法
	def set_username(self,name): #定义一个方法,通过set方法修改私有属性username
		self.__username = name

u1 = User("阿文","18","boy")
print(u1)
print(u1.get_username()) #通过get方法访问私有属性__username
u1.set_username("小明") #通过set_username方法修改名字
print(u1)

在变量名前加下划线:把参数设置为私有变量,然而这样属性在外部就不可读写,这时需要增加get、set方法。但是这样在外部调用时代码很繁琐,所以用装饰器@property简化get、set方法。

第二种方法:property()

class User(object):
	def __init__(self,username,age,gender):
		self.__username = username
		self.__age = age
		self.__gender = gender

	def __str__(self):
		return "name:"+self.__username+" 年龄:"+self.__age+" 性别:"+self.__gender+""
	#get方法
	def get_username(self):
		return self.__username
	#set方法
	def set_username(self,name):
		self.__username = name

	change = property(get_username,set_username) #通过get和set命名一个方法change,可以访问和修改私有化属性

u1 = User("阿文","18","boy")
print(u1.change)
u1.change = "小明"
print(u1)

Python 中提供了 property() 函数,可以实现在不破坏类封装原则的前提下,依旧使用“类对象.属性”的方式操作类中的属性property()。

函数的基本使用格式:属性名=property(fget=None, fset=None, fdel=None, doc=None)

第三种方法:通过装饰器@property在get方法上进行装饰

class User(object):
	def __init__(self,username,age,gender):
		self.__username = username
		self.__age = age
		self.__gender = gender

	def __str__(self):
		return "name:"+self.__username+" 年龄:"+self.__age+" 性别:"+self.__gender+""
	@property
	def username(self):   #这里的username和下面@username.setter中的username必须一致
		return self.__username
	@username.setter
	def username(self,name):
		self.__username = name

	

u1 = User("阿文","18","boy")
print(u1.username)
u1.username = "小明"
print(u1)

2、继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。

继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。 在python中一个类能继承自不止一个父类,这叫做python的 多重继承 。

class RichMan(object):
	def __init__(self):
		self.money = 1000000000
		self.company = "阿里巴巴"
	def tell_motto(self):
		print("我对钱不感兴趣。(—_—)")

	def __myself(self):   #定义一个私有属性的方法
		print("我以前是一个教师。")


class Son(RichMan):   #括号中写RichMan表示继承的父类是RichMan
	#继承RichMan类
	pass

s = Son()   
print(s.money)
print(s.company)
s.tell_motto() #访问父类中的tell_motto方法
上面的代码:RichMan是父类,Son是子类 子类可以继承父类的属性和方法。 注意:继承父类并不是所有的方法和属性都能继承,只能继承公开的属性和方法,私有的属性和方 法是不能被继承的。如上面的代码中,私有方法__myself(self)不能被子类Son继承。

重写:

class RichMan(object):
	def __init__(self):
		self.money = 1000000000
		self.company = "阿里巴巴"
	def tell_motto(self):
		print("我对钱不感兴趣。(—_—)")

	def working(self):
		print("A员工表现的好。")


class Son(RichMan):
	#继承RichMan类
	def working(self):
		print("B员工表现的更好!")

s = Son()
print(s.money)
print(s.company)
s.tell_motto()
s.working()
继承可以实现方法的重写 方法的重写(覆盖 Override ) : 在继承的基础之上,如果子类的方法父类不能满足自己使用的时候,那 么可以重写这个方法。 注意:重写方法的时候,方法的名称、参数一定要和父类必须一致。 例如上面的代码:父类RichMan和子类Son中都有相同的方法working,虽然Son继承于RichMan,但是依然执行Son中的方法。 面试题:python 中有没有方法的重载?有没有方法的重写? 方法的重载(Overload): 函数名称相同,但是函数的参数个数或者类型不同 结论:python中有方法的重写,但是没有方法的重载,但是可以实现方法的重载(装饰器)。 Python 是支持多继承, class Son(RichMan,object , XXX,XXXX) 那么如果 A 类是继承 B 类和 C 类, B 和 C 同时有一个 H ()方法,请问 A 继承的是哪个 H ()? 按照继承的顺序来找(广度优先)。 super 关键字:是一个指针,默认指向的父类
class RichMan(object):

	def working(self):
		print("A员工表现的好。")


class Son(RichMan):
	#继承RichMan类
	def working(self):
		print("B员工表现的更好!")

	def test(self):
		self.working()
		super().working()  #用super关键字指向父类

s = Son()
s.test()

3、多态:

多态( python 中不重要):指的是对象的多种状态,多态是基于继承的基础之上,父类引用指向子 类实例的现象叫做多态。 注意:在弱数据类型语言中,因为不用声明数据类型,所以天生就支持多态。 关于面向对象的知识就介绍到这里了,掰掰。。。。。。OVO

上一篇:cookie 封装和使用


下一篇:UI测试框架搭建