python 编程开发 —— 面向对象编程

文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。


笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888

1、简述

  Python 从设计之初就已经是一门面向对象的语言,正因为如此,在 Python 中创建一个类和对象是很容易的。本章节我们将详细介绍 Python 的面向对象编程。

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 方法(function):类中定义的函数。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

  和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。

  Python 中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。

  对象可以包含任意数量和类型的数据。

2、类的定义

格式

  类的定义由关键词 class 控制,在类名后面需要添加冒号(":")。

# 创建类
class className:    
	# 成员函数(行为方法)
	def __init__(self):  # 构造函数,系统默认的,
		print('__init__')
	def __init__(self, param): # 构造函数也可以自定义
		print('class self.param' %self.param)
		
	def __del__(self):  #析构函数(这里面主要用于销毁对象)
		print('__del__')
	
	# 成员变量(特征属性)
	param = 0;
	
# 定义对象
x = className()
x.__init__()  # 访问成员函数
x.__init__(1) # 访问自定义构造函数
x.param  # 访问成员变量

3、self 是什么

  self 代表类的实例,而非类。类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。其作用类似于C/C++中的 this。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

class Aliven:  # 在 python 中,类名一般大写字母开头
    
    # 成员函数
    def __init__(self, name, age):  # 重写构造方法
        self.name = name;
        self.age = age;
    
    def printName(self):
        print('my name is %s' % self.name) # 输出打印
    
    def printAge(self):
        print('my age is {0}'.format(self.age)) # 格式化打印

    # 成员变量
    name = ''
    age  = 0


tt = Aliven('Aliven', 28);

tt.printName();
tt.printAge();

4、私有属性和方法

类的私有属性:

  __private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。但是类的属性并不是绝对的私有,这个其实是一种伪私有,我们用过使用 obj._ClassName__attrs 依旧是能访问类对象的。

类的方法
  在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。

  self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。

类的私有方法
  __private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。

>>> class A:
	def __init__(self, num):
		self.__num = num
	def printNum(self): # 外部访问私有变量接口
		print('num = %d'% self.__num)
	__num = 100  # 成员变量私有化

	
>>> a = A(120)
>>> a.printNum()
num = 120
>>> a.__num  # 私有化的成员变量无法直接被访问

Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    a.__num
AttributeError: A instance has no attribute '__num'


>>> a._A__num # 通过 className 可访问私有变量
120

5、继承

  Python 同样支持类的继承和多继承,如果一种语言不支持继承,类就没有什么意义。

  子类中如果有与父类相同名称的方法 或者 属性,则父类中的方法 或者 属性将会被子类覆盖,关于 方法 的覆盖,在编程语言中被称为 方法重写。

格式

# 单一继承
class ChildClassName(BaseClassName):
	# 子类属性、方法
	

# 多继承
class ChildClassName(BaseClassName1, BaseClassName2, BaseClassName3, ...):
	# 子类属性、方法	
	

  方法重写:如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,实例如下:

  super 函数: super 函数能够帮我们自动找到基类的方法,并且为我们传入 self 参数。其优点在于,我们不需要给出具体基类的名称,他会自动帮我们找到所有的基类以及其方法。

#!/usr/bin/python3
 
class Parent:        # 定义父类
   def myMethod(self):
      print ('I am parent')
 
class Child(Parent): # 定义子类
   def myMethod(self):
      print ('I am child')
 
c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法

注意事项

  • 在 Python 中不建议使用方法重载,因为 Python 中声明变量不需要类型关键词。所以在 Python 日常编程中,也不建议使用重载。

猜你喜欢

转载自blog.csdn.net/Aliven888/article/details/114691991