一、定义

1.面向对象编程(OOP)

面向对象编程(Object-oriented Programming,简称OOP)是一种编程范例,它提供了一种结构化程序的方法,以便将属性和行为捆绑到单个对象中。

例如,对象可以表示具有姓名属性,年龄,地址等的人,具有行走,说话,呼吸和跑步等行为。或者包含收件人列表,主题,正文等属性的电子邮件,以及添加附件和发送等行为。

换句话说,面向对象编程是一种, 可以为具体现实世界的事物建模的方法,如汽车以及公司和员工,学生和教师等事物之间的关系. OOP将现实世界的实体建模为软件对象,以及与之相关的数据,并可以执行某些功能。

另一种常见的编程范例是函数式编程,其构造类似于顺序执行的程序,因为它以函数和代码块的形式提供一组执行步骤,这些步骤一步步执行以完成任务。

关键的一点是,对象是面向对象编程范例的核心,不仅在函数编程中表示数据,而且在程序的整体结构中也是如此。

注意:由于Python是一种多范式编程语言(也就是说面向对象或者函数式编程都是可以的),您可以选择最适合手头问题的范例,在一个程序中混合使用不同的范例,和/或随着程序的发展从一种范例切换到另一种范例。

2.Python中的类

首先关注数据,每个事物或对象都是某个类的实例。

Python中可用的原始数据结构(如数字,字符串和列表)旨在分别表示简单的事物,例如某事物的成本,诗歌的名称和您喜欢的颜色。

如果你想代表更复杂的东西怎么办?

例如,假设您想跟踪许多不同的动物。如果您使用了列表,则第一个元素可以是动物的名称,而第二个元素可以表示其年龄。

你怎么知道哪个元素应该是哪个?如果你有100种不同的动物怎么办?你确定每只动物都有名字和年龄,等等吗?如果你想为这些动物添加其他属性怎么办?这就是为什么我们需要一个"类"(Class)。

类可以用来创建新的用户定义的数据结构,其中包含有关内容的任意信息。对于动物,我们可以创建一个Animal( )类来跟踪关于Animal的属性,如名称和年龄。

注意, 一个类只提供结构 - 它是应该如何定义某个东西的蓝图,但它实际上并不提供任何真实的内容. Animal( )类可以指定名称和年龄, 是定义动物所必需的,但它实际上不会包含特定动物的名字或年龄。

可以将"类"视为"某事物的定义".

3.Python实例(对象)

虽然类是蓝图,但实例是具有实际值的类的副本,字面上是属于特定类的对象。这不再是一个想法;它是一只真正的动物,就像一只名叫罗杰的狗,已经八岁了。

换句话说,类就像一个表格或问卷。它定义了所需的信息。填写表格后,您的特定副本就是该类的一个实例;它包含与您相关的实际信息。

您可以填写多个副本以创建许多不同的实例,但如果没有表单作为指导,您将会彻底迷失,不知道需要哪些信息。因此,在创建对象的单个实例之前,我们必须首先通过定义类来指定所需的内容。

二、创建和使用类

1.创建类

使用类几乎可以模拟任何东西。下面来编写一个表示小狗的简单类Dog——它表示的不是特
定的小狗,而是任何小狗。对于大多数宠物狗,我们都知道些什么呢?它们都有名字和年龄;我
们还知道,大多数小狗还会蹲下和打滚。由于大多数小狗都具备上述两项信息(名字和年龄)和
两种行为(蹲下和打滚),我们的Dog类将包含它们。这个类让Python知道如何创建表示小狗的对
象。编写这个类后,我们将使用它来创建表示特定小狗的实例。

dog.py

class Dog():def __init__(self, name, age):#初始化属性name和ageself.name = nameself.age = agedef sit(self):#模拟小狗被命令时蹲下print(self.name.title() + " is now sitting.")def roll_over(self):#模拟小狗被命令时打滚#print(self.name.title() + " rolled over!")

2.根据类创建实例

可将类视为有关如何创建实例的说明。 Dog类是一系列说明,让Python知道如何创建表示特
定小狗的实例。
下面来创建一个表示特定小狗的实例:

my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")

My dog’s name is Willie.
My dog is 6 years old.

PS:遇到 object() takes no parameters,说明 init 写错了,因为是左右都是2个下划线。是左边两个,右边也是两个!!!

1. 访问属性

my_dog.name

my_dog.name.title()将my_dog的属性name的值’willie’改为首字母大写的; 在第2条print语句中,
str(my_dog.age)将my_dog的属性age的值6转换为字符串

2. 调用方法

my_dog.sit()
my_dog.roll_over()

3. 创建多个实例

my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 3)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
my_dog.sit()
print("\nYour dog's name is " + your_dog.name.title() + ".")
print("Your dog is " + str(your_dog.age) + " years old.")
your_dog.sit()

My dog’s name is Willie.
My dog is 6 years old.
Willie is now sitting.

Your dog’s name is Lucy.
Your dog is 3 years old.
Lucy is now sitting.

3.使用类和实例

3.1.给属性指定默认值

class Dog():def __init__(self, name, age):#初始化属性name和ageself.name = nameself.age = age#给狗狗叫声属性指定默认值为“wangwang”self.speek="wangwang"def get_speek(self):print("This dog bark:"+str(self.speek) + ".")my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
my_dog.get_speek()

My dog’s name is Willie.
This dog bark:wangwang.

3.2.修改属性的值

3.2.1 直接修改属性的值

要修改属性的值,最简单的方式是通过实例直接访问它。下面的代码直接将狗狗叫声设置为“wawu~”

my_dog.speek="wawu~"
my_dog.get_speek()

This dog bark:wawu~

3.2.2 通过方法修改属性的值

如果有替你更新属性的方法,将大有裨益。这样,你就无需直接访问属性,而可将值传递给一个方法,由它在内部进行更新。
下面的示例演示了一个名为update_speek()的方法:

class Dog():--snip-- #为节省篇幅,不多加重复前面描述过的方法def update_speek(self,speek):self.speek=speek
my_dog.update_speek("aowu~")
my_dog.get_speek()

This dog bark:aowu~

注意!!!

--snip--只是为了笔记的简洁
例如:
class Dog():--snip-- #为节省篇幅,不多加重复前面描述过的方法
你在需要运行编译的代码里面得补充完整
class Dog():def __init__(self, name, age):#初始化属性name和ageself.name = nameself.age = age#给狗狗叫声属性指定默认值为“wangwang”self.speek="wangwang"def get_speek(self):print("This dog bark:"+str(self.speek) + ".")

4.继承

继承是一个类采用另一个类的属性和方法的过程。新形成的类称为子类,子类派生的类称为父类。

重要的是要注意子类覆盖或扩展父类的功能(例如,属性和行为)。换句话说,子类继承了父项的所有属性和行为,但也可以添加不同行为。最基本的类是一个对象,通常所有其他类都继承为它们的父对象。

4.1 继承

狗公园示例
让我们假装我们在一个狗公园。有多个Dog对象, 发起不同的Dog行为,每个对象都有不同的属性。一般来说,这意味着有些狗正在跑步,而有些正在伸展,有些正在盯着其他狗。此外,每只狗都由它的主人命名,并且由于每只狗都是活生生的, 各个年龄段的都有。

将一只狗与另一只狗区分开来的另一种方法是什么?狗的品种怎么样:

class Dog:def __init__(self, breed):self.breed = breedspencer = Dog("German Shepard")
print(spencer.breed)sara = Dog("Boston Terrier")
print(sara.breed)

German Shepard
Boston Terrier

每种犬的行为略有不同。考虑到这些因素,让我们为每个品种创建单独的类。这些是父类Dog的子类。

4.2扩展父类的功能

运行下方代码:

class Dog:# Class attributespecies = 'mammal'def __init__(self, name, age):self.name = nameself.age = agedef description(self):return "{} is {} years old".format(self.name, self.age)def speak(self, sound):return "{} says {}".format(self.name, sound)# Child class (inherits from Dog() class)
class RussellTerrier(Dog):def run(self, speed):return "{} runs {}".format(self.name, speed)# Child class (inherits from Dog class)
class Bulldog(Dog):def run(self, speed):return "{} runs {}".format(self.name, speed)# Child classes inherit attributes and
# behaviors from the parent class
jim = Bulldog("Jim", 12)
print(jim.description())# Child classes have specific attributes
# and behaviors as well
print(jim.run("slowly"))

Jim is 12 years old
Jim runs slowly
您完成此程序时,请仔细阅读代码, 以搞清其中的原理,然后在运行程序之前,先在大脑中预测一下输出结果, 然后和真正的输出结果比对一下, 看看是否一致.

我们没有添加任何特殊属性或方法来区分RussellTerrier和Bulldog,但由于它们现在是两个不同的类,我们可以为它们添加一个速度的类属性。

4.3 确定是否父类

isinstance()函数用于确定实例是否也是某个父类的实例。

# Parent class
class Dog:# Class attributespecies = 'mammal'def __init__(self, name, age):self.name = nameself.age = agedef description(self):return "{} is {} years old".format(self.name, self.age)def speak(self, sound):return "{} says {}".format(self.name, sound)# Child class (inherits from Dog() class)
class RussellTerrier(Dog):def run(self, speed):return "{} runs {}".format(self.name, speed)# Child class (inherits from Dog() class)
class Bulldog(Dog):def run(self, speed):return "{} runs {}".format(self.name, speed)# Child classes inherit attributes and
# behaviors from the parent class
jim = Bulldog("Jim", 12)
print(jim.description())# Child classes have specific attributes
# and behaviors as well
print(jim.run("slowly"))# Is jim an instance of Dog()?
print(isinstance(jim, Dog))# Is julie an instance of Dog()?
julie = Dog("Julie", 100)
print(isinstance(julie, Dog))# Is johnny walker an instance of Bulldog()
johnnywalker = RussellTerrier("Johnny Walker", 4)
print(isinstance(johnnywalker, Bulldog))# Is julie and instance of jim?
print(isinstance(julie, jim))

Jim is 12 years old
Jim runs slowly
True
True
False


TypeError Traceback (most recent call last)
in ()
51 # Is julie and instance of jim?
----> 52 print(isinstance(julie, jim))

TypeError: isinstance() arg 2 must be a type or tuple of types

jim和julie都是Dog()类的实例,而johnnywalker不是Bulldog()类的实例。然后作为一个完整性检查,我们测试了julie是否是jim的实例,这是不可能的,因为jim是类的实例而不是类本身 - 因此是TypeError的原因。

4.4 覆盖父类的功能

请记住,子类也可以覆盖父类的属性和行为。举些例子:

class Dog:species = 'mammal'class SomeBreed(Dog):--snip-- class SomeOtherBreed(Dog):species = 'reptile'frank = SomeBreed()
print(frank.species)beans = SomeOtherBreed()
print(beans.species)

mammal
reptile
SomeBreed()类从父类继承物种,而SomeOtherBreed()类覆盖物种,将其设置为爬行动物

PS:上述代码适合python3,python2版本需要稍加修改
定义新类时,Python 3隐式使用object作为父类。所以以下两个定义是等价的:

class Dog(object):pass# In Python 3, this is the same as:class Dog:pass

注意:在Python 2.x中,新风格类和旧风格类之间存在区别。不在这里详细介绍,但是通常希望您将对象指定为父类,以确保在编写Python 2 OOP代码时定义新样式类。

Python零基础入门(四)——Python面向对象编程[学习笔记]相关推荐

  1. Python零基础入门(三)——函数[学习笔记]

    目录: 一.函数: 1.内置函数 2.定义函数 二.函数参数: 1.必选参数 2.默认参数 3.可变参数/任意参数 4.关键字参数 三.return语句 四.函数封装 1.导入整个模块 2.导入特定的 ...

  2. 视频教程-Python零基础入门教程-Python

    Python零基础入门教程 从2012年从事互联网至今有7年软件编程经验,曾任职国内北京互联网公司,中南林业大学授课Python 现任逻辑教育Python课程负责人,精通Python语言,精通人工智能 ...

  3. python零基础入门教材-python如何零基础学习,如何入好门?

    本文以<小白带你学Python>为内容方向,试图在繁杂的信息里,给你找到你学习Python的动力和路径, 在前文中我们提到: Python岗位有哪些呢?主要的岗位有这些:Python全栈开 ...

  4. Python 零基础入门到实战(一)笔记:内置对象、浅拷贝、深拷贝、计算圆面积、凯撒密码、英文大小写转换、输入国家打印出国家名和首都、输入数字英文输出、统计句子中的字母数量、猜随机数

    Python入门到实战(一) 为什么写这篇文章 Part 1 入门部分 什么是编程语言? Python的优势 目前应用 特点 Part 2 6种内置对象 1 整数.浮点数 2 字符串 3 列表 4 元 ...

  5. python零基础入门教材-Python零基础入门到精通自学视频教程

    最近,网上流传一组<人工智能实验教材>的图片,照片火起来的原因是教材是为幼儿园的小朋友们设计的Python被列入小学.初高中教材已不是新鲜事,现在又成功"打入"了幼儿园 ...

  6. Python入门必备,Python零基础入门

    近几年来,Python发展势头强劲,越来越多的公司加大了对Python开发人才的招聘.很多人都看好Python的发展,纷纷前来学习Python. 目前Python应用范围还是挺多的,从Web.爬虫.数 ...

  7. 跟艾文学编程《零基础入门学Python》(4)Python 面向对象

    作者: 艾文,计算机硕士学位,企业内训讲师和金牌面试官,公司资深算法专家,现就职BAT一线大厂. 邮箱: 1121025745@qq.com 博客:https://wenjie.blog.csdn.n ...

  8. 跟艾文学编程《零基础入门学Python》(1)Python 基础入门

    作者: 艾文,计算机硕士学位,企业内训讲师和金牌面试官,现就职BAT一线大厂公司资深算法专家. 邮箱: 1121025745@qq.com 博客:https://wenjie.blog.csdn.ne ...

  9. 跟艾文学编程 《零基础入门学Python》Jupyter Notebook安装和使用

    作者: 艾文,计算机硕士学位,企业内训讲师和金牌面试官,公司资深算法专家,现就职BAT一线大厂. 邮箱: 1121025745@qq.com 内容:跟艾文学编程<零基础入门学Python​​​​ ...

  10. python零基础入门教程(非常详细),从零基础入门到精通,看完这一篇就够了

    前言 本文罗列了了python零基础入门到精通的详细教程,内容均以知识目录的形式展开. 第一章:python基础之markdown Typora软件下载 Typora基本使用 Typora补充说明 编 ...

最新文章

  1. 机器学习基石4-在何时才能使用机器学习(4)
  2. matlab中的mkdir函数_科学网—Matlab中计算函数运行时间的三种方法及判断新建文件夹 - 张伟的博文...
  3. 企业网络推广——企业网络推广专员浅析网站关键词优化要注意哪些问题
  4. 极光商智®服务器2007今日正式发布
  5. 《DSP using MATLAB》Problem 7.4
  6. 软件业的作业示意流程图
  7. 深入理解session过期机制
  8. ConcurrentProgramming:wait()和notify()和synchronized
  9. 百位云计算专家齐聚湖畔大学,阿里云MVP全球闭门会聚焦数字化转型
  10. ASP.NET Core 自动检查编译项目组件配置
  11. 使用“Grafeas”元数据API和“Kritis”部署授权管理软件供应链
  12. sap服务器安装双系统教程,安装双系统教程,新手入门必看教程
  13. [java编程题]打印指定年指定月份的日历
  14. 小学计算机二课堂活动总结,信息技术第二课堂活动总结
  15. 如何通俗易懂地理解什么叫泛型?
  16. Dubbo之默认协议dubbo
  17. BI Publisher 模板开发语法大全
  18. GBase产品学习-8a支持隐式转换
  19. 记蚂蚁金服前端第一次电面(校招)
  20. 徒给别人做嫁衣——与人共同创业(1)

热门文章

  1. 李开复:21世纪最需要的7种人才
  2. 643. 子数组最大平均数 I
  3. python中的and_我想问下python中 逻辑与:“”和“and”的区别
  4. redis zset转set 反序列化失败_关于Redis中的五种数据结构,要知其然知其所以然...
  5. java 坦克大战_java课程设计之坦克大战
  6. cesium画飞线_基于Cesium绘制抛物弧线
  7. 10条买房错误思维,你中招了几条?
  8. 口嫌体直聂远,撩人于无形茅子俊,《皓镧传》吴谨言求问该选谁?
  9. LindAgile~缓存拦截器支持类的虚方法了
  10. 购物车单选全选,计算总价,出现个小问题,没找到.....