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

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

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

一、程序中定义类和对象

1、 定义类

定义函数时,函数只检测语法,不执行代码,但是定义类的时候,类体代码会在类定义阶段就立刻执行,并且会产生一个类的名称空间,也就是说类的本身其实就是一个容器/名称空间(__dict__),是用来存放名字的,这是类的用途之一。

语法格式如下:

class ClassName:
<statement-1>
.
.
.
<statement-N>

类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。

使用类名访问其属性:


# 注意类中定义变量使用驼峰体
class OldboyStudent():
school = 'oldboy' def choose_course(self):
print('is choosing course') print(OldboyStudent.__dict__)
# {'__module__': '__main__', 'school': 'oldboy', 'choose_course': <function OldboyStudent.choose_course at 0x10d653ae8>, '__dict__': <attribute '__dict__' of 'OldboyStudent' objects>, '__weakref__': <attribute '__weakref__' of 'OldboyStudent' objects>, '__doc__': None} print(OldboyStudent.__dict__['school'])
# oldboy print(OldboyStudent.__dict__['choose_course'])
# <function OldboyStudent.choose_course at 0x10d653ae8> try:
OldboyStudent.__dict__['choose_course']()
except Exception as e:
print('error:', e)
# error: choose_course() missing 1 required positional argument: 'self' print(OldboyStudent.school)
# oldboy print(OldboyStudent.choose_course(111))
# is choosing course print(OldboyStudent.choose_course)
# <function OldboyStudent.choose_course at 0x10d653ae8> OldboyStudent.country = 'China'
print(OldboyStudent.__dict__['country'])
# 'China'

del OldboyStudent.school
print(OldboyStudent.__dict__)
# {'__module__': '__main__', 'choose_course': <function OldboyStudent.choose_course at 0x00000000026FEEE0>, '__dict__': <attribute '__dict__' of 'OldboyStudent' objects>, '__weakref__': <attribute '__weakref__' of 'OldboyStudent' objects>, '__doc__': None, 'country': 'CHINA'}

2、 定义对象

调用类即可产生对象,调用类的过程,又称为类的实例化,实例化的结果称为类的对象/实例。

stu1 = OldboyStudent()  # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例
print(stu1.school) # oldboy stu2 = OldboyStudent() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例
print(stu2.school) # oldboy stu3 = OldboyStudent() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例
stu3.choose_course() # is choosing course

二、定制对象独有特征

1、引入

对于上述的学生类,如果类的属性改了,则其他对象的属性也会随之改变

class OldboyStudent():
school = 'oldboy' def choose_course(self):
print('is choosing course') stu1 = OldboyStudent()
stu2 = OldboyStudent() OldboyStudent.school = 'OLDBOY'
print(stu1.school) # OLDBOY print(stu2.school) # OLDBOY

2、定制对象独有特征

对象本质类似于类,也是一个名称空间,但是对象的名称空间存放对象独有的名字,而类中存放的是对象们共有的名字。

因此我们可以直接为对象单独定制名字。

print(stu1.__dict__)  # {}
print(stu2.__dict__) # {} stu1.name = 'tank'
stu1.age = 18
stu1.gender = 'male' print(stu1.name, stu1.age, stu1.gender)
# tank 18 male try:
print(stu2.name, stu2.age, stu2.gender)
except Exception as e:
print(e)
# 'OldboyStudent' object has no attribute 'name' stu2.name = 'sean'
stu2.age = 19
stu2.gender = 'female' print(stu2.name, stu2.age, stu2.gender)
# sean 19 female

3、对象属性查找顺序

首先从自身查找,没找到往类中找,类中没有则会报错。即对象的属性查找顺序为:自身—>类—>父类—>报错。

class OldboyStudent:
school = 'oldboy'
count = 0
aa = 10 #类的的公共变量aa def __init__(self, x, y, z): # 会在调用类时自动触发
self.name = x # stu1.name='耗哥'
self.age = y # stu1.age=18
self.sex = z # stu1.sex='male'
OldboyStudent.count += 1
# self.count += 1
self.aa = 1 #对象的私有变量aa def choose_course(self):
print('is choosing course') print(OldboyStudent.count) # 0 stu1 = OldboyStudent('nick', 18, 'male')
print(stu1.count) # 1 stu2 = OldboyStudent('sean', 17, 'male')
print(stu2.count) # 2 stu3 = OldboyStudent('tank', 19, 'female')
print(stu3.count) # 3 print(OldboyStudent.count) # 3 # 由于上述修改的是类属性,类属性的count已经被修改为3,所以其他实例的count都为3
print(stu1.count) # 3
print(stu2.count) # 3
print(stu3.count) # 3 # 由于aa是私有属性,因此stu们都会用自己私有的aa,不会用类的aa。count也不属于对象
print(stu1.__dict__) # {'name': 'nick', 'age': 18, 'sex': 'male', 'aa': 1}
print(stu2.__dict__) # {'name': 'sean', 'age': 17, 'sex': 'male', 'aa': 1}
print(stu3.__dict__) # {'name': 'tank', 'age': 19, 'sex': 'female', 'aa': 1}

4、类定义阶段定制属性

类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用。

调用类时发生两件事:

  1. 创造一个空对象
  2. 自动触发类中__init__功能的执行,将stu1以及调用类括号内的参数一同传入。
class OldboyStudent:
school = 'oldboy' def __init__(self, name, age, gender):
"""调用类的时候自动触发"""
self.name = name
self.age = age
self.gender = gender
print('*' * 50) def choose_course(self):
print('is choosing course') try:
stu1 = OldboyStudent()
except Exception as e:
print(e)
# __init__() missing 3 required positional arguments: 'name', 'age', and 'gender' stu1 = OldboyStudent('nick', 18, 'male')
# ************************************************** print(stu1.__dict__)
# {'name': 'nick', 'age': 18, 'gender': 'male'} #没有school

三、对象的绑定方法

  • 类名称空间中定义的数据属性和函数属性都是共享给所有对象用的

  • 对象名称空间中定义的只有数据属性,而且是对象所独有的数据属性。

1、类使用对象的绑定对象

类中定义的函数是类的函数属性,类可以使用它,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个

class OldboyStudent:
school = 'oldboy' def __init__(self, name, age, gender):
self.name = name
self.age = age
self.sex = gender def choose_course(self):
print(f'{self.name} choosing course') def func(self):
print('from func') print(OldboyStudent.choose_course)
# <function OldboyStudent.choose_course at 0x00000000023AEF70> try:
OldboyStudent.choose_course(123)
except Exception as e:
print(e)
# 'int' object has no attribute 'name'

2、对象使用对象的绑定方法

  • 类中定义的函数是共享给所有对象的,对象也可以使用,而且是绑定给对象用的,

  • 绑定的效果:绑定给谁,就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入。

类中定义的函数,类确实可以使用,但其实类定义的函数大多情况下都是绑定给对象用的,所以在类中定义的函数都应该自带一个参数self。

self代表类的实例,而非类

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self,self 代表的是类的实例。

self 不是 python 关键字,我们把他换成 aaabbb也是可以正常执行的:

class OldboyStudent:
school = 'oldboy' def __init__(self, name, age, gender):
self.name = name
self.age = age
self.sex = gender def choose_course(self):
print(f'{self.name} choosing course') def func(self):
print('from func')
stu1 = OldboyStudent('nick', 18, 'male')
stu2 = OldboyStudent('sean', 17, 'male')
stu3 = OldboyStudent('tank', 19, 'female') stu1.choose_course() #相当于 stu1.choose_course(stul) 对象调对象绑定的方法,会自动传参
# nick choosing course stu2.choose_course()
# sean choosing course stu3.choose_course()
# tank choosing course stu1.func()
# from func
stu2.func()
# from func

四、类与数据类型

python3中统一了类与类型的概念,类就是类型

class Foo:
def __init__(self,name):
self.name = name f = Foo('name') obj = Foo()
print(type(obj))
# <class '__main__.Foo'> lis = [1, 2, 3] # 相当于 lis = list([1,2,3])
print(type(lis))
# <class 'list'>

lis.append(4)  # 对象调对象绑定的方法,会自动传参
list.append(lis,4) # 类调用对象绑定的方法,必须得传参

对象其实就是一个高度整合的产物,整合数据与专门操作该数据的方法(绑定方法)

import pymysql

class Foo:
def __init__(self, host, port, db, chartset):
self.host = host
self.port = port
self.db = db
self.charset = chartset def exc1(self, sql):
conn = pymysql.connect(self.host, self.port, self.db, self.charset)
conn.execute(sql)
return xxx def exc2(self, proc_name):
conn = pymysql.connect(self.host, self.port, self.db, self.charsett)
conn.call_proc(proc_name)
return xxx obj1 = Foo('1.1.1.1', 3306, 'db1', 'utf-8')
obj1.exc1('select * from t1')
obj1.exc1('select * from t2') obj2 = Foo('1.1.1.2', 3306, 'db1', 'utf-8')
obj2.exc1('select * from t4')

15、Python面向对象基础的更多相关文章

  1. 十六、python面向对象基础篇

    面向对象基础: 在了解面向对象之前,先了解下变成范式: 编程范式是一类典型的编程风格,是一种方法学 编程范式决定了程序员对程序执行的看法 oop中,程序是一系列对象的相互作用 python支持多种编程 ...

  2. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  3. python面向对象基础

    面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将 ...

  4. Python 面向对象基础知识

    面向对象基础知识 1.什么是面向对象编程? - 以前使用函数 - 类 + 对象 2.什么是类什么是对象,又有什么关系? class 类: def 函数1(): pass def 函数2(): pass ...

  5. python 面向对象基础和高级复习

    面向对象基础 面向对象编程 面向过程编程:类似于工厂的流水线 优点:逻辑清晰 缺点:扩展性差 面向对象编程:核心是对象二字,对象属性和方法的集合体,面向对象编程就是一堆对象交互 优点:扩展性强 缺点: ...

  6. 1.Python面向对象基础

    面向对象(OOP) 面向对象编程--object oriented programming 简写 OOP   面向过程和面向对象的区别: 面向过程: 1.把完成某一个需求的所有步骤从头到尾逐步实现 2 ...

  7. python面向对象基础-01

    面向对象(OOP)基本概念 前言 话说三国时期曹军于官渡大败袁绍,酒席之间,曹操诗兴大发,吟道:喝酒唱歌,人生真爽! 众将直呼:"丞相好诗",于是命印刷工匠刻板印刷以流传天下; 待 ...

  8. [python面向对象]--基础篇

    1.#类 #类就是一个模板,模板里可以包含多个函数,函数里实现一些功能 #定义一个类 class bar: def foo(self,agr): print(self,agr) obj = bar() ...

  9. python——面向对象基础

    概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...

随机推荐

  1. Linux内核kobject结构体分析

    1.前言 Linux内核中有大量的驱动,而这些驱动往往具有类似的结构,根据面向对象的思想,可以将共同的部分提取为父类,而这个父类就是kobject,kobject结构体中包含了大量设备的必须信息,而三 ...

  2. Java开发笔记(一百四十五)FXML布局的伸展适配

    前面介绍了FXML的基本格式及其控制器的用法,算是打通了FXML方式的编码流程.程序界面通常保持固定尺寸,不过有时也允许用户拖曳窗口大小,不拖不打紧,一拖就可能坏事.像之前的登录窗口,没拖的时候界面如 ...

  3. LOJ2874 JOISC2014 历史研究 分块、莫队

    传送门 看到出现次数自然地考虑莫队. 但是发现如果需要删除并动态维护答案的话,则要用一个堆来维护答案,增加了一个\(log\).但是加入操作却没有这个\(log\),所以我们考虑避免删除操作. 分块, ...

  4. 关于暗网需要关闭JS的处理

    最近电视剧导致暗网热度很大,执法力度也大了很多,大部分暗网聚集地都不允许开JS权限访问(原因大家都懂,防止钓鱼执法)​ 因为是英文版而且是火狐,所以简单记录下,以防小白蛋疼 再打开就可以了 Tor协议 ...

  5. Web前端推荐学习站点

    http://javascript.ruanyifeng.com/   JavaScript参考标准教程,写的很不错. https://www.xiaohuochai.cc/  小火柴前端站 http ...

  6. AppTheme属性设置集合

    现在新建一个项目基本都会在 style.xml 设置基础的 AppTheme,但是系统的给提供的设置属性又比较多. 所以在此收集记录,以便之后查找方便. <style name="Ap ...

  7. 腾讯java面试经验 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.腾讯等公司offer,岗位是Java后端开发,因为发展原因最终选择去了腾讯,入职一年时间了,也成为了面试官,之 ...

  8. JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法)

    JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法) 一丶正则的用法 创建正则对象: 方式一: var reg=new ...

  9. [摘抄] 4.require命令

    4.require命令 1. 基本用法 Node适用CommonJS模块规范,内置的require命令用于加载模块文件. require命令的基本功能是,读入并执行一个JavaScript文件,然后返 ...

  10. PHP获取当前脚本的绝对路径方法

    一.dirname(__FILE__) 比如:a.php所在路径为/var/www/web/a.php dirname(__FILE__)返回的则是/var/www/web/ 二.__DIR__ a. ...