type
date
slug
category
icon
password
if name == 'main'面向对象编程基础教程创建类创建实例对象访问和增删属性类的内置属性操作python内置类属性内置属性重组操作1. __str__() 和__repr__()2. __len__()3. python类的数学运算4. Python类的__slots__方法5.Python类的__call__方法python对象销毁(垃圾回收)类的继承多重继承方法重写类的检测方式类属性和方法单下划线、双下划线、头尾双下划线说明:设计模式和系统架构
if name == 'main'
面向对象编程基础教程
程序设计得范式
抽象并建立对象模型
程序使不同对象之间得调用关系
属性 ← 类 ← 实例化
class Person: pass
class Person(): pass
class Person(object): pass
类的初始化可以避免实例赋予属性时,相似变量名的多次累加,难以维护。
类属性可以动态修改,修改后所有实例访问都会变化。
- 同时存在时,实例属性优先级高于类属性
- 当实例没有和类同名的时候,通过实例对象,依然可以访问到类属性。
- 类私有属性和实例私有属性无法外部访问,但可以在类的内部访问,私有属性是为了保护类或实例属性不被外部污染而设计的。
- 为了操作实例对象的私有属性,我们定义了实例方法;同样的,如果需要需要操作类的私有属性,则应该定义类的方法。
创建类
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对象销毁(垃圾回收)
类的继承
面向对象的编程带来的主要好处之一是
代码的重用
,实现这种重用的方法之一是通过继承机制,继承父类的属性和方法,新添子类的属性和方法通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
多重继承

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)
的变量, 只能是允许这个类本身进行访问了。
设计模式和系统架构
- Author:felixfixit
- URL:http://www.felixmicrospace.top/article/python_oop
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!