Python之面向对象

 

编程范式:面向过程编程、面向对象编程(OPP)、面向函数编程。

 

面向对象

  • 类(Class)
    • 一类拥有相同属性、方法的对象的抽象
  • 对象(Object)
    • 一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象

面向对象特性

  • 封装
    • 第一层意义:创建类和对象时,分别创建两者的名称空间。只能通过类名加“.”或者obj.的方式访问里面的名字;
    • 第二层意义:类中把某些属性和方法隐藏起来,或者定义为私有,只在类的内部使用,在类的外部无法访问,或者留下少量的接口(函数)供外部访问;
    • 根据职责将属性和方法封装到一个抽象的类中
  • 继承
    • 一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
    • 实现代码的重用,相同的代码不需要重复的编写
  • 多态
    • 多态不同的子类对象调用相同的父类方法,产生不同的执行结果
    • 多态可以增加代码的灵活度,以继承和重写父类方法为前提是调用方法的技巧,不会影响到类的内部设计

 

面向对象编程

最简单的面向对象编程,self是为了给类传入参数liming:

class man(): 
	def say(self):
		print("Hello!")

liming = man() #类实例化成对象
liming.say() #本质上是man.say(),self接收liming
#输出
Hello!

  

 

 

如何给类传入参数?在类中有一个__init__函数,添加如下代码:

class man(): #man是类名
	def __init__(self,name): #构造函数,在实例化时做一些类初始化的工作
		self.name = name #实例变量,赋值给实例

	def say(self):
		print("%s,say hello!" % (self.name))

liming = man("liming")
liming.say()

zhangsan = man("zhangsan")
zhangsan.say()
#输出
liming,say hello!
zhangsan,say hello!

  

 

实例变量

self.name = name就是实例变量(静态属性),赋值给实例,作用域是实例本身。

class man():
   def __init__(self,name):
      self.name = name

  

  

类方法

def say()就是类的方法(动态属性),类的功能。

class man():
   def __init__(self,name):
      self.name = name

   def say(self):
      print("%s,say hello!" % (self.name))

  

 

类变量

version就是类变量,它可以不需要实例化就调用,也可以实例化进行调用。(如果出现实例与类中重名问题,先找实例变量,再找类变量)

class man():
   version = "1.0.0"
   def __init__(self,name):
      self.name = name

print(man.version) 
liming = man("liming")
print(liming.version)

  

 

类变量的用途:大家共有的属性,节省内存。如果生成上千上万个实例的话,实例变量会被创建上千上万个,虽然达到的效果一样。

class man():
	version = "1.0.0"
	def __init__(self,name,version= "1.0.0"):
		self.name = name

  

析构函数

在实例释放、销毁的时候执行的,通常用于做一些收尾工作,如关闭数据库连接、关闭打开的临时文件等。

class man():
    	def __del__(self):
		pass

  

私有方法与私有属性

私有:只有类中内部可以访问,外部不能访问。

不是私有属性/方法的话,外部是可以进行访问和修改的。

class man():
	def __init__(self,name):
		self.name = name
		self.passwd = "123456"

liming = man("liming")
print(liming.passwd)
liming.passwd="abc123456"
print(liming.passwd)
#输出
123456
abc123456

  

私有属性/方法在属性名/方法名前面加上__符号,不允许类外进行访问和修改,只能通过类中的函数对私有属性进行修改。

class man():
	def __init__(self,name):
		self.name = name
		self.__passwd = "123456"

	def changepass(self,newpasswd):
		self.__passwd = newpasswd
		print(self.__passwd)


liming = man("liming")
#没有liming.passwd/liming.__passwd属性
#只能通过一下changepass方法来查看或修改内部属性
liming.changepass("abc123456")

#输出
abc123456

  

 

posted @ 2020-02-16 14:28  看不尽的尘埃  阅读(239)  评论(0编辑  收藏  举报