Python3 面向对象编程基础
Contents
面向对象编程——Object Oriented Programming,简称 OOP,是一种程序设计思想。 OOP 把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向对象基本概念
类(Class)
: 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。类变量
:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。数据成员
:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。方法重写
:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。局部变量
:定义在方法中的变量,只作用于当前实例的类。实例变量
:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。继承
:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟”是一个(is-a)”关系(例图,Dog是一个Animal)。实例化
:创建一个类的实例,类的具体对象。方法
:类中定义的函数。对象
:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
创建类
使用 class
语句来创建一个新类,class 之后为类的名称并以冒号结尾:
class ClassName:
'类的帮助信息' # 类文档字符串
class_suite # 类体
实例
一个简单的 Python 类定义代码:
class Employee:
'所有员工的基类'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print "Total Employee %d" % Employee.empCount
def displayEmployee(self):
print "Name : ", self.name, ", Salary: ", self.salary
empCount
变量是一个类变量,它的值将在这个类的所有实例
之间共享。你可以在内部类或外部类使用 Employee.empCount 访问。- 第一种方法
init()
方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法。 self
代表类的实例,而非类;self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
以上代码执行结果为;
<main.Test instance at 0x10d066878> main.Test 从执行结果可以很明显的看出,
self
代表的是类的实例,代表当前对象的地址,而self.class
则指向类。self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的。
init() 方法
要注意到 __init__
方法的第一个参数永远是 self,表示创建的实例本身,因此,在 init 方法内部,就可以把各种属性绑定到 self,因为 self 就指向创建的实例本身。
同时有了 init 方法,在创建实例的时候,我们就不能传入空的参数了,必须传入与 init 方法匹配的参数,但 self 不需要传, Python 解释器自己会把实例变量传进去。代码示例:
class ListNode:
"""
Definition for singly-linked list.
"""
def __init__(self, x):
self.val = x
self.next = None
# next 参数在创建类实例对象时, 不能传,只能通过类实例属性赋值
l1 = ListNode(2)
l1.next = ListNode(4)
print(l1.val, l1.next) # 2,4
和普通的函数相比,在类中定义的函数只有一点不同,就是类方法第一个参数永远是实例变量 self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。
创建实例对象
实例化类其他编程语言中一般用关键字 new,但是在 Python 中并没有这个关键字,类的实例化类似函数调用方式。以下代码,使用类的名称 Employee 来实例化,并通过 init() 方法接收参数。
"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)
访问类属性,我们可以使用点号 .
来访问对象的属性。以下代码,使用如下类的名称访问类变量:
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount
Python 内置属性
__dict__
: 类的属性(包含一个字典,由类的数据属性组成)__doc__
:类的文档字符串__name__
: 类名__module__
: 类定义所在的模块(类的全名是’main.className’,如果类位于一个导入模块 mymod中,那么className.module 等于 mymod)__bases__
: 类的所有父类构成元素(包含了一个由所有父类组成的元组
Python 内置属性调用实例代码如下:
class Employee:
'所有员工的基类'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print "Total Employee %d" % Employee.empCount
def displayEmployee(self):
print "Name : ", self.name, ", Salary: ", self.salary
print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__
代码执行后输出结果如下:
Employee.doc: 所有员工的基类 Employee.name: Employee Employee.module: main Employee.bases: () Employee.dict: {‘module’: ‘main’, ‘displayCount’: , ’empCount’: 0, ‘displayEmployee’: , ‘doc’: ‘\xe6\x89\x80\xe6\x9c\x89\xe5\x91\x98\xe5\xb7\xa5\xe7\x9a\x84\xe5\x9f\xba\xe7\xb1\xbb’, ‘init’: }
参考资料
Python 面向对象 《廖雪峰-Python3教程》
相关文章
- pycharm安装python3.6_python安装教程
- pycharm中tensorflow配置环境_python3.6安装tensorflow
- dockerfile制作:制作python3下的robotframework运行环境
- pycharm怎么安装requests模块_python3安装模块
- [Python3]Numpy数组转置的三种方法T、transpose、swapaxes「建议收藏」
- Linux系统安装Python3环境(超详细)
- python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」
- python3.x默认使用UTF-8编码_pycharm怎么debug
- python3.6写一个http接口服务,给别人调用1
- tensorflow pycharm教程_tensorflow支持python3.8吗
- python3 高斯函数
- pycharm如何创建新项目_Python3
- pycharm配置tensorflow环境_python3.6对应的tensorflow版本
- 关于Python3的import问题(pycharm可以运行,命令行import错误)
- python3.7安装pip_centos怎么安装
- python2 和 python3 常见差异及兼容方式梳理
- python3 软连接_python3哪个版本好用
- 解决pycharm添加python2.7解释器出现Failed to create virtual environment和添加python3.8解释器SDK无效问题[通俗易懂]
- ROS中cv_bridge如何用python3进行编译
- Ubuntu卸载python3.6「建议收藏」