课时37:类与对象:面向对象编程
目录:
一、self是什么
二、Python的魔法方法
三、公有和私有
四、课时37课后习题及答案
*****************
一、self是什么
*****************
对象的方法都有一个self参数,那这个self参数是什么呢?如果之前接触过其它的编程语言,例如c++,那么你应该很容易对号入座,Python的self其实就相当于C++的this指针。
如果把类比作是图纸,那么由类实例化后的对象才是真正可以住的房子。根据一张图纸就可以设计出成千上万的房子,它们长得都差不多,但它们都有不同的主人。每个人都只能回到自己的家里,陪伴自己的孩子...所以self这里相当于每个房子的门牌号,有了self,你就可以轻松找到自己的房子。Python的self是同一个道理,由同一个类可以生成无数的对象,当一个对象的方法被调用的时候,对象会将自身的引用作为第一个参数传给该方法,那么Python就知道需要操作哪个对象的方法了。
通过一个例子感受下:
class Ball:def setName(self, name):self.name = namedef kick(self):print("我叫%s,该死的,谁踢我..." % self.name)
>>> a = Ball() >>> a.setName('球A') >>> # 第一个参数self告诉Python是a对象在调用方法,因为是隐藏的并且由Python自己传入,所以我们这里不需要写进来。 >>> b = Ball() >>> b.setName('球B') >>> c = Ball() >>> c.setName('土豆') >>> a.kick() 我叫球A,该死的,谁踢我... >>> b.kick() 我叫球B,该死的,谁踢我... >>> c.kick() 我叫土豆,该死的,谁踢我...
self参数的详解可以参考博客:https://blog.csdn.net/CLHugh/article/details/75000104
**************************
二、Python的魔法方法
**************************
Python的对象天生拥有一些神奇的方法,它们是面向对象的Python的一切。Python的这些具有魔力的方法,总是被下划线所包围的,今天就来说一说一个最基本的特殊方法:_ _init_ _()。
通常把_ _init_ _()方法称作构造方法,_ _init_ _()的魔力体现在只要实例话一个对象,这个方法就会在这个对象被创建时自动调用(在c++里可以看到类似的东西,叫“构造函数”)。
其实,实例化对象时是可以传入参数的,这些参数会自动传入_ _init_ _()方法中,可以通过重写这个方法来自定义对象的初始化操作。举个例子:
class Ball:def __init__(self, name):self.name = namedef kick(self):print("我叫%s,该死的,谁踢我..." % self.name)
>>> p = Ball("土豆") >>> p.kick() 我叫土豆,该死的,谁踢我...
******************
三、公有和私有
******************
一般面向对象的编程语言都会区分公有和私有的数据类型,像c++和Java它们使用public和private关键字,用于声明数据是公有的还是私有的,但在Python中并没有用类似的关键字来修饰。
难道Python所有东西都是透明的?也不全是,默认上对象的属性和方法都是公开的,可以直接通过点操作符(.)进行访问:
>>> class Person:name = '小甲鱼'>>> p = Person() >>> p.name '小甲鱼'
为了实现类似私有变量的特征,Python内部采用了一种叫name mangling(名字改编)的技术,在Python中定义私有变量只需要在变量名或函数名前加上“_ _”两个下划线,那么这个函数或变量就会成为私有的了:
>> class Person:__name = '小甲鱼'>>> p = Person() >>> p.__name Traceback (most recent call last):File "<pyshell#23>", line 1, in <module>p.__name AttributeError: 'Person' object has no attribute '__name'
这样在外部将变量名“隐藏”起来了,理论上如果要访问,就需要从内部进行:
class Person:__name = '小甲鱼'def __init__(self,name):self.__name = namedef getName(self):return self.__name
>>> p = Person("小甲鱼") >>> p.__name Traceback (most recent call last):File "<pyshell#25>", line 1, in <module>p.__name AttributeError: 'Person' object has no attribute '__name' >>> p.getName() '小甲鱼'
但是你认真琢磨一下这个技术的名字name mangling(名字改编),那么不难发现其实Python只是动了一下手脚,把双下横线开头的变量进行了改名而已。实际上在外部你使用“_类名_ _变量名”即可访问双下横线开头的私有变量了:
>>> p._Person__name '小甲鱼'
(注:Python目前的私有机制其实是伪私有,Python的类是没有权限控制的,所有变量都是可以被外部调用的。)
********************************
四、课时37课后习题及答案
********************************
转载于:https://www.cnblogs.com/DC0307/p/9525132.html
课时37:类与对象:面向对象编程相关推荐
- 饥荒时用java写的吗_【图片】类与对象面向对象编程【饥荒mod制作吧】_百度贴吧...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 ----------深入饥荒的类 上一节讲完了基本概念,如果还心存疑虑可以百度搜索"类与对象"以获取更多信息 本节将深入研究饥荒代码中 ...
- 【设计模式从青铜到王者】第二篇:UML类图与面向对象编程
系列文章目录 文章目录 系列文章目录 前言 一.设计概念 二.对象和类 三.类层次结构 四.面向对象程序设计基础概念 1.抽象 2.封装 3.继承 4.多态 5.对象之间的关系 总结 前言 一.设计概 ...
- mooc程序设计与算法(三)C++面向对象程序设计 类和对象提高 编程作业 5:魔兽世界之一:备战
5:魔兽世界之一:备战 这道题是典型的,看了题目不想做题系列... 题目太长,看了,看不懂....后来,上网找了某博客中据说是老师的代码,研究了一下,觉得真的,c++面向对象编程还是很深奥的....下 ...
- 怎样用uml类图生成java类_JAVA:面向对象编程的底层逻辑,深度剖析
什么是面向对象 在目前的软件开发领域有两种主流的开发方法,分别是结构化开发方法和面向对象开发方法.早期的编程语言如C.Basic.Pascal等都是结构化编程语言,随着软件开发技术的逐渐发展,人们发现 ...
- 第1章 类和对象—面向对象概念
面向对象程序设计(Object-Oriented Programming,OOP)是一种程序设计架构,同时也是一种程序开发的方法.对象指的是类的实例,它将对象作为程序的基本单元,将程序和数据封装其中, ...
- python实例属性与类属性_Python 面向对象编程:类的创建与初始化、实例属性与方法、类属性与方法...
1. 类的创建并实例化 类的定义:在Python中,类通过class 关键字定义.按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的.下面是一个 ...
- 从一个“信用卡”类理解python面向对象编程的核心概念
以下类的代码来自:Data structures and algorithms in python第二章 实例: 信用卡 CreditCard: 识别信息 - Customer, Bank, Acco ...
- [C# 类和对象]-C# 中的方法以及类和对象编程
################################################## 目录 C# 的方法 C# 定义方法 访问修饰符 返回值类型 方法名 参数列表 方法主体 方法名的命 ...
- ad09只在一定范围内查找相似对象_23、面向对象编程
目录: 对象的概念 类与对象 面向对象编程 类的定义与实例化 属性访问 类属性与对象属性 属性查找顺序与绑定方法 小结 视频链接 一 对象的概念 "面向对象"的核心是"对 ...
- 面向对象编程其实很简单——Python 面向对象(初级篇)
在Python教学中发现,很多同学在走到面向对象编程这块就开始蒙圈了,为了帮助大家更好的理解面向对象编程并其能将其用到自己的开发过程中,特写此文. 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式 ...
最新文章
- Babel 相关资料
- 让弹出窗口变得“体贴”一些
- 数据中心管理中的人工智能:其对人员配置和流程意味着什么?
- 操作Frame和IFrame中页面元素
- 指令级并行--计算机体系结构
- 和套套一样,一次性橡胶手套制作现场, 这鬼畜的画风
- 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议6~10)...
- Pig 实现关键词匹配
- 综合微软、AMiner两大学术图谱,清华大学唐杰博士如何将Open Academic Graph亿级数据精准匹配
- pc弹窗宽度_弹窗设计的5条原则
- Win10系统电脑声卡驱动正常但没声音?驱动人生解决方案
- wireshark抓包获取好友ip,定位所在位置
- 网易云音乐人申请教程(会唱歌即可)
- 请求成功但是报错: Uncaught (in promise)
- 【应用层】DNS协议
- 关于zigbee的一些术语
- Trips and Users
- 爱立信中国总裁杨迈猝死 爱立信中国惊魂48小时
- ajax异步请求数据库实现级联下拉菜单。
- 富文本编辑器--获取JSON
热门文章
- mysql百万级数据测试_百万级数据mysql测试环境介绍
- java 模拟 cmd_用JAVA模拟实现CMD命令行
- java中的jackson_Java中的JSON数据绑定框架Jackson使用介绍
- Markdown效率参考手册
- Tomcat打开远程调试和jmx远程监控
- html网站地图在线生成,网站地图(sitemap)在线制作工具
- linux没有检测到触摸板,linux – 制作没有按钮的触摸板,就像带有按...
- windows mac linux 木马,针对Linux Windows macOS系统Adwind木马广告攻击
- kali64位下载怎么是AMD_电脑达人速更 NVIDIA 显卡和 AMD 显卡驱动程序又双叒叕更新啦!...
- linux系统q7文件,linux系统安装包的管理