OOP

  • 思想

    • 以模块化思想解决工程问题
    • 面向过程 vs 面向对象
    • 由面向过程转向面向对象
  • 常用名词

    • OO:面向对象
    • ooa:分析
    • ood:设计
    • oop:编程
    • ooI:实现
    • ooa -> ood -> ooi
  • 类 vs 对象

    • 类:抽象,描述的是一个集合,侧重于共性
    • 对象:具象,描述的是个体
  • 类的内容

    • 动作,函数
    • 属性,变量
  • is-a

  • 定义类:class关键字

  • 类命名:

    • 遵循大驼峰
    • 第一个字母大写

#定义学生类,和几个学生
>>> class Student():
# 此处定义一个空类
# pass是关键字,表示占位用的,无意义
pass # 定义一个对象
>>> xiaobai = Student() >>> class PythonStudent():
name = "NoOne"
age = 18
course = "Python" #定义类中的函数,一般需要有self关键字,其余跟普通函数基本相同
>>> def giveMeMoney():
print("给我钱")
return None >>> xiaobai = PythonStudent()
>>> print(xiaobai.name)
>>> print(xiaobai.age)
>>> print(xiaobai.course) 输出:
NoOne
18
Python

类的属性


# 类的例子
# 注意类的定义
>>> class Student():
name = "哈哈哈"
age = 19 >>> def sayHi(self):
print("小乔要努力变强")
return None # 实例化
>>> zhaosi = Student()
>>> print(zhaosi.name)
>>> zhaosi.sayHi() 输出:
哈哈哈
小乔要努力变强

self

  • self可以用别的名称代替
  • self不是关键字
  • 作用是指代本身

# self # 实例调用函数
>>> class Student():
name = "哈哈哈"
age = 19 >>> def sayHi(self): # self不是一个关键字 只是一个形参 可以任意替换
print("小乔要努力变强")
return None >>> xiaoqiao = Student() # 打招呼
>>> xiaoqiao.sayHi() #上面定义的sayHi()方法 是需要一个参数的 但是这里是默认将调用者放入了
#此时不能再传入参数 会报参数过多的错误 输出:
小乔要努力变强

类的变量作用域的问题

  • 类变量:属于类自己的变量
  • 实例变量:属于实例的变量
  • 访问实例的属性,如果实例没有定义属性,则自动访问类的属性,如果类也没有定义则报错

>>> class Student():
# name,age是类的变量
# 注意类的变量的定义位置和方法
# 不需要前缀
name = "哈哈哈"
age = 19 >>> def sayHi(self, n, a):
self.name = n
self.age = a
print("My name is {},i am {} years old".format(self.name,self.age))
return None # 实例变量可以使用类的变量
>>> hh = Student()
>>> hh.sayHi("嘻嘻",17)
>>> print("My name is {},i am {} years old".format(Student.name,Student.age))
>>> print("My name is {},i am {} years old".format(hh.name,hh.age)) 输出:
My name is 嘻嘻,i am 17 years old
My name is 哈哈哈,i am 19 years old
My name is 嘻嘻,i am 17 years old

访问类的属性

  • 在类里面如果强制访问类的属性,则需要使用_class_,(注意前后的两个下划线)
  • 类方法:
    • 定义类的方法的时候,没有self参数
    • 类的方法中只允许使用类的内容
    • 两种用法
      • ClassName
      • class ,前后各两个下划线

>>> class Student():
# name,age是类的变量
# 注意类的变量的定义位置和方法
# 不需要前缀
name = "哈哈哈"
age = 19 >>> def sayHi(self):
print("My name is {},i am {} years old".format(self.name,self.age))
return None # sayHi是类方法
# 如何访问类的变量
# 但是调用需要用到特殊的方法
>>> def sos():
# 类方法中不允许访问实例的任何内容
print("My name is {},i am {} years old".format(Student.name,__class__.age))
return None # 类的方法
>>> s = Student()
>>> s.sayHi()
>>> Student.sos() 输出:
My name is 哈哈哈,i am 19 years old
My name is 哈哈哈,i am 19 years old

构造函数

  • 类在实例化的时候,执行一些基础性的初始化的工作
  • 使用特殊的名称和写法
  • 在实例化的时候自动执行
  • 是在实例化的时候第一个被执行的函数(此处先这样理解)

# 注意类的定义
>>> class Student():
name = "NoName"
age = 0 # 构造函数名称固定,写法相对固定
>>> def __init__(self):
print("我是构造函数") >>> xiaoming = Student()
>>> print("-------------")
>>> print(xiaoming.name)
>>> print(xiaoming.age) 输出:
我是构造函数
-------------
NoName
0

面向对象的三大特征

  • 继承
  • 封装
  • 多态

继承

  • 子类可以使用父类定义的内容或者行为等
  • 继承的实现
    • 父类、基类、超类:被继承的类,Base Class,Supper Class
    • 子类:有继承行为的类
    • 所有类都必须有一个父类,如果没有,则默认是object的子类

# 所有类必须有父类
# 默认是Object
>>> class Person1():
pass >>> class Person2(object):
pass >>> class Person():
name = "NoName"
age = 0 # 父类写在类定义的时候的括号里
>>> class Teacher(Person):
pass >>> t = Teacher()
>>> print(t.name) 输出:
NoName --------------------------------------------------------------------------------------------------- >>> class Bird():
fly = "I can fly"
>>> def flying(self):
print("我会飞了") >>> class BirdMan(Person,Bird):
pass >>> bm = BirdMan()
>>> bm.flying()
>>> print(bm.name) 输出:
我会飞了
NoName

issubclass检测是否是子类

  • 可以用来检测两个类的父子关系

# 利用刚才定义的Bird,BirdMan,Person,Teacher检测父子关系 >>> print(issubclass(BirdMan,Bird))
>>> print(issubclass(BirdMan,Person))
>>> print(issubclass(BirdMan,Teacher)) 输出:
True
True
False

构造函数

- 在函数实例化的时候调用的一个函数
- 自动调用
- 要求,第一个参数必须有,一般推荐self
- 构造函数的调用时间:一般认为在实例化的时候第一个被调用
- 一般不手动调用,实例化的时候自动调用,参数需写入类名称后面的括号中

>>> class Bird():
>>> def __init__(self):
print("我被调用了")
return None #此时被调用的构造函数
>>> b = Bird() 输出:
我被调用了 --------------------------------------------------------------------------------------------------- # 构造函数2
>>> class Person():
def __init__(self,name,age):
print(name,age) >>> p = Person("哈哈哈",19) 输出:
哈哈哈 19

构造函数的继承

  • 构造函数默认继承
  • 一旦子类定义了构造函数,则不再自动调用父类构造函数

# 构造函数默认继承 >>> class Person():
def __init__(self, name, age):
print("Person=({},{})".format(name, age)) >>> class Teacher(Person):
pass >>> t = Teacher("哈哈哈",19) # 上面的构造函数是需要两个参数的,而下面却没有给出所以会报错
#t = Teacher() 输出:
Person=(哈哈哈,19)

总结

Python和Java都是面向对象的,因此还是比较好理解的,但是Python定义的语法上还是跟Java有一些区别的,消化吸收,加油。

Python学习记录5-面向对象的更多相关文章

  1. Python学习记录day7

    目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...

  2. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  3. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  4. Python学习记录day8

    目录 Python学习记录day8 1. 静态方法 2. 类方法 3. 属性方法 4. 类的特殊成员方法 4.1 __doc__表示类的描述信息 4.2 __module__ 和 __class__ ...

  5. Python学习记录:括号配对检测问题

    Python学习记录:括号配对检测问题 一.问题描述 在练习Python程序题的时候,我遇到了括号配对检测问题. 问题描述:提示用户输入一行字符串,其中可能包括小括号 (),请检查小括号是否配对正确, ...

  6. 实验楼Python学习记录_挑战字符串操作

    自我学习记录 Python3 挑战实验 -- 字符串操作 目标 在/home/shiyanlou/Code创建一个 名为 FindDigits.py 的Python 脚本,请读取一串字符串并且把其中所 ...

  7. 【python学习-5】面向对象的python

    python是一种面向对象的编程语言,虽然与C++一样,支持面向过程的程序设计,python完全可以使用函数.模块等方式来完成工作,但是当使用python编写一个较大的项目时,则应该考虑使用面向对象的 ...

  8. 我的Python学习记录

    Python日期时间处理:time模块.datetime模块 Python提供了两个标准日期时间处理模块:--time.datetime模块. 那么,这两个模块的功能有什么相同和共同之处呢? 一般来说 ...

  9. python核心编程学习记录之面向对象编程

    未完待续525

  10. Python 学习记录

    记录一些 学习python 的过程 -------------------------------------- 1. 初始学习 @2013年10月6日 今天开始学习python 了 遇到好多困难但是 ...

随机推荐

  1. 图解 HTTP 笔记(三)—— HTTP 报文内的 HTTP 信息

    本章主要讲解请求和响应是如何运作的 一.HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文,客户端的 HTTP 报文叫做请求报文,服务器端的叫做响应报文. HTTP 报文大致可分为报 ...

  2. 关于Jmeter测试移动端应用时提示非法登录,不是合法的登录设备时的解决办法

    当Jmeter测试移动端应用时提示非法登录,不是合法的登录设备时的解决办法:只需要在jmeter的http信息头管理器中配置相应的设备信息,可通过抓包工具得到:即头信息Header中的Miscella ...

  3. PyQt5 调用 View 视图的方法

    一.使用Qt Designer 1. 直接引用ui文件: from PyQt5.uic import loadUi class MainWindow(QDialog): def __init__(se ...

  4. windows下redis配置密码

    redis安装后目录如下: 最简单的启动方式是直接双击redis-server.exe 如果要设置密码,首先打开配置文件,要注意的是这两个都是配置文件,记住你改的是哪一个,不放心的可以两个都改. 然后 ...

  5. unity3d 触屏多点触控(旋转与缩放)

    unity3d 触屏多点触控(旋转与缩放) /*Touch OrbitProgrammed by: Randal J. Phillips (Caliber Mengsk)Original Creati ...

  6. JAVA数据结构和算法 3-简单排序

    排序中的两种基本操作是比较和交换.在插入排序中还有移动. 冒泡排序:两两比较相邻元素,如果较大数位于较小数前面,则交换: 每一趟遍历将一个最大的数移到序列末尾,共遍历N-1趟. 如果执行完一趟之后没有 ...

  7. Re0:在.NetCore 中Dapper的基本用法

    整理一下目前在用的Dapper 与FrameWork不同,NetCore数据库配置需要从appsettings.json中获取 刚接触的时候被这块坑了,自己手动建了个app.config.然后你懂的( ...

  8. 【FFMPEG】不要试图用msvc来编译ffmpeg

    原文:http://blog.csdn.net/hn756si/article/details/41147497 出于学习目的,想建一个vs2010工程来编译ffmpeg(http://www.ffm ...

  9. 【计算机视觉】关于OpenCV中GPU配置编译的相关事项

    [计算机视觉]关于OpenCV中GPU配置编译的相关事项 标签(空格分隔): [计算机视觉] 前一段发现了OpenCV中关于GPU以及opencl的相关知识,打算升级一下对OpenCV的使用,但是发现 ...

  10. Spring switch的使用

    首先在html开始标签中引入一个属性 1 xmlns:th="http://www.thymeleaf.org" 示例代码 <div th:switch="${us ...