Lazy loaded image
🐍Python 教程
基于 Python 面相对象开发
Words 3086Read Time 8 min
2024-12-11
2024-12-11
type
date
slug
category
icon
password
 

if name == 'main'

 

面向对象编程基础教程

程序设计得范式
抽象并建立对象模型
程序使不同对象之间得调用关系
属性 ← 类 ← 实例化
 
class Person: pass
class Person(): pass
class Person(object): pass
 
类的初始化可以避免实例赋予属性时,相似变量名的多次累加,难以维护。
类属性可以动态修改,修改后所有实例访问都会变化。
  1. 同时存在时,实例属性优先级高于类属性
  1. 当实例没有和类同名的时候,通过实例对象,依然可以访问到类属性。
  1. 类私有属性和实例私有属性无法外部访问,但可以在类的内部访问,私有属性是为了保护类或实例属性不被外部污染而设计的。
  1. 为了操作实例对象的私有属性,我们定义了实例方法;同样的,如果需要需要操作类的私有属性,则应该定义类的方法。

创建类

 
self 代表的并非类,而是类的实例。这是类的方法不同于普通函数之处。self是约定俗成,也可以换成任何一个关键字。

创建实例对象

实例化类其他编程语言中一般用关键字 new,但是在 Python 中并没有这个关键字,类的实例化类似函数调用方式
以下使用类的名称 Employee 来实例化,并通过 __init__ 方法接收参数。

访问和增删属性

添加,删除,修改类的属性
其他访问属性方式
  • getattr(obj, name[, default]) : 访问对象的属性。
  • hasattr(obj,name) : 检查是否存在一个属性。
  • setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
  • delattr(obj, name) : 删除属性。

类的内置属性操作

python内置类属性

  • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
  • __doc__ : 类的文档字符串
  • __name__: 类名
  • __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
  • __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

内置属性重组操作

1. __str__()__repr__()

str()用于显示给用户,而__repr()用于显示给开发人员
当使用str()时,实际调用的是__str__()方法。打印的类的内存地址
而直接输入变量,调用的是__repr__()方法。下面通过重写__repr__()方法,使直接输入变量,姐可以查看内部信息。

2. __len__()

斐波那契数列是由 0, 1, 1, 2, 3, 5, 8...构成。
请编写一个Fib类,Fib(10)表示数列的前10个元素,print Fib(10) 可以打印出数列的前 10 个元素,len(Fib(10))可以正确返回数列的个数10。

3. python类的数学运算

4. Python类的__slots__方法

假设Person类通过__slots__定义了name和gender,请在派生类Student中通过__slots__继续添加score的定义,使Student类可以实现name、gender和score 3个属性。

5.Python类的__call__方法

如果把一个类实例也变成一个可调用对象,可以实现一个特殊的方法__call__()。
请实现前面介绍过的斐波那契数列类Fib,加入__call__方法,使得调用的方式如下简单。

python对象销毁(垃圾回收)

类的继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制,继承父类的属性和方法,新添子类的属性和方法
通过继承创建的新类称为子类派生类,被继承的类称为基类父类超类

多重继承

notion image
A类被继承了连词,那么A的__init__()方法,是否会被调用两次呢?
实践证明,在多重继承里,A虽然被继承了两次,但是__init__()的方法只调用一次。

方法重写

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

类的检测方式

用issubclass()或者isinstance()方法来检测。
  • issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)
  • isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。

类属性和方法

类的方法
在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
 
类的私有属性和定义类方法访问
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs
如果需要需要操作类的私有属性,则应该定义类的方法。
类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods
Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName( 对象名._类名__私有属性名 )访问属性
 

单下划线、双下划线、头尾双下划线说明:

  • __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
  • _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
  • __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
 

设计模式和系统架构

 
  1. Python3 面向对象
  1. Python面向对象编程
人人都懂设计模式:从生活中领悟设计模式:Python实现
模型思维(24种让人终身受益的思维模型)
 
上一篇
Python常用库之Re(Regular Expression)
下一篇
AP系列01-预备知识

Comments
Loading...