python类和对象课件_简单解释Python的类和对象
前言:
对象是模拟真实世界,把数据和程序进行封装 。
对象 = 属性+ 方法
我们需要用类来创造一个对象,就像我们要用图纸来造房子一样。在Python中函数名是以小写字母开头 ,类名是以大写字母开头。
0x00:面向对象(Object Oriented)我们一般称为OO,OO的特征有
1.封装
就像我们对列表的操作一样,很多方法已经封装好了,我们只需要调用自己需要的方法的名字就好了
>>> list1 = [2,1,7,4,3]
>>> list1.sort()
>>> list1
[1, 2, 3, 4, 7]
>>> list1.append(9)
>>> list1
[1, 2, 3, 4, 7, 9]
>>>
2.继承
继承是子类自动共享父类之间数据和 方法的机制
>>> class Mylist(list):
pass
>>> list2 = Mylist()
>>> list2.append(5)
>>> list2.append(6)
>>> list2
[5, 6]
>>> list2.append(3)
>>> list2.sort()
>>> list2
[3, 5, 6]
>>>
我们创建的类可以继承列表的很多属性
3.多态
多态就是不同对象对同一方法响应不同的行动
>>> class A:
def fun(self):
print('我是0verflow')
>>> class B:
def fun(self):
print('我是XX')
>>> a = A()
>>> b = B()
>>> a.fun()
我是0verflow
>>> b.fun()
我是XX
>>>
我们上面的程序用到了self,但是它 什么东西我们并没有解释,其实它就相当于一个序号
>>> class Ball:
def setname(self,name):
self.name = name
def kick(self):
print('谁踢我%s。。。。。' % self.name)
>>> a = Ball()
>>> a.setname('A')
>>> b = Ball()
>>> b.setname('B')
>>> c= Ball()
>>> c.setname('C')
0x01:python的 魔法方法 __init__(self)(构造方法):
__init__(self , param1, param2...)
因为我们设置了默认参数如果不传入参数就会报错 。
0x02:公有和私有
公有和私有的意义这里我就不解释了,就是字面意思
默认来说对象的属性和方法都是公有的,为了实现私有Python内部给出了一个name mangling(名字改编,名字重整)的机制
在python中定义私有变量只需要在变量名或函数名前加上‘’__‘’两个下划线,Python所谓的私有只是意义上的,为什么这么说看下面的代码大家就明白了。
>>> class Person:
name = '0verflow'
>>> p = Person()
>>> p.name
'0verflow'
>>> class Preson:
__name = '0verflow'
>>> p = Person()
>>> p.__name
Traceback (most recent call last):
File "", line 1, in
p.__name
AttributeError: 'Person' object has no attribute '__name'
>>>
针对上面的代码想打印私有还是可以的,不过要多写一个函数:
>>> class Preson:
__name = '0verflow'
def getname(self):
return self.__name
>>> p = Preson()
>>> p.getname()
'0verflow'
>>>
其实我们也可以通过另一种方式:_类名__变量名
>>> class Preson:
__name = '0verflow'
def getname(self):
return self.__name
>>> p._Preson__name
'0verflow'
>>>
这里我们在来说一下继承:
被继承者我们 称为基类或父类,继承者我们称为子类,子类可以继承父类的属性和方法。
>>> class Parent:
def hello(self):
print('正在调用父类的方法')
>>> class Child(Parent):
pass
>>> p = Parent()
>>> p.hello()
正在调用父类的方法
>>> c = Child()
>>> c.hello()
正在调用父类的方法
>>> class Child(Parent):
def hello(self):
print('正在调用子类的方法')
>>> c = Child()
>>> c.hello()
正在调用子类的方法
>>> p.hello()
正在调用父类的方法
>>>
在举一个例子说明一下:
import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -= 1
print('我的位置是:',self.x ,self.y)
class Goldfish(Fish):
pass
class Carp(Fish):
pass
class Shark(Fish):
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print('饿了,要进食')
self.hungry = False
else:
print('吃饱了')
从上面的例子运行的结果可以看出,我们在让shark移动的时候莫名其妙的报错了,原因是因为我们从新定义了__init__()所以覆盖掉了父类的方法和属性。针对 这个问题有两种解决的办法:
1.使用未绑定的父类
看一下运行的结果:
>>> fish = Fish()
>>> fish.move()
我的位置是: 2 8
>>> goldfish = Goldfish()
>>> goldfish.move()
我的位置是: 9 0
>>> shark = Shark()
>>> shark.eat()
饿了,要进食
>>> shark.eat()
吃饱了
>>> shark.move()
Traceback (most recent call last):
File "", line 1, in
shark.move()
File "D:\Python\test\test.py", line 10, in move
self.x -= 1
AttributeError: 'Shark' object has no attribute 'x'
>>>
import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -= 1
print('我的位置是:',self.x ,self.y)
class Goldfish(Fish):
pass
class Carp(Fish):
pass
class Shark(Fish):
def __init__(self):
Fish.__init__(self)
self.hungry = True
def eat(self):
if self.hungry:
print('饿了,要进食')
self.hungry = False
else:
我们增加了一行代码 :Fish.__init__(self)这行代码中的self已经不是父类的self了,而是子类的self
运行的结果:
>>> shark = Shark()
>>> shark.move()
我的位置是: -1 3
>>>
2、super()
import random as r
class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -= 1
print('我的位置是:',self.x ,self.y)
class Goldfish(Fish):
pass
class Carp(Fish):
pass
class Shark(Fish):
def __init__(self):
super().__init__()
self.hungry = True
def eat(self):
if self.hungry:
print('饿了,要进食')
self.hungry = False
else:
print('吃饱了')
这种方法是将上一种方法的那一条添加的语句改为: super().__init__()
看一下运行的结果:
>>> shark = Shark()
>>> shark.move()
我的位置是: -1 5
>>>
第二种方法比较简单便捷,所以我们一般情况会用第二种方法。
多重继承:一个子类可以继承多个父类的属性和方法
>>> class Base1:
def fool1(self):
print('我是fool1')
>>> class Base2:
def fool2(self):
print('我是fool2')
>>> class C(Base1,Base2):
pass
>>> c = C()
>>> c.fool1()
我是fool1
>>> c.fool2()
我是fool2
>>>
多继承很容易导致一些不可知的错误,所以一般情况下我们是不使用的。
相关文章:

awk5.0 — awk模式之一
再次重申awk的语法 awk [options] ‘Pattern {Actions}’ file1,file2… awk模式,在之前的文章中简单使用了BEGIN和END。这里的模式,其实我们可以理解成是条件,awk是一行行处理数据的,如果满足某个条件awk就处理某一行数据&#x…

CF331A1,331A2
链接:http://codeforces.com/problemset/problem/331/A1 题意:不翻译了。 思路:A1题数据范围小,暴力是可行的,我果断暴力了。不过,话说,除了暴力我还会什么。。。闲话少说。A2的话,采…

SCCM 2012系列9 补丁分发上
HI,今天我会给大家介绍SCCM 2012的补丁分发,分为上中下,当然希望大家多多指教哦 1 服务器配置 1.1 环境要求 如果SCCM和WSUS在同一台服务器上那没什么,但如果WSUS和SCCM分别在不同的服务器上,那么WSUS服务器需要把S…

python基础-垃圾回收机制
垃圾回收 Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。 引用计数 原理:当一个对象的引用被创建或者复制时,对象的引用计数加1;当一个对象的引用被销毁时,对象的引用计数减1&am…

awk 6.0 — awk模式之二
awk的语法 awk [options] ‘Pattern {Actions}’ file1,file2… 之前介绍了三种模式:空模式,关系运算模式,BEGIN/END模式 正则模式 模式可以理解成条件,正则模式就是满足正则表达式条件的,就执行相应的动作…

根据搜索来路 弹出相应广告
根据搜索来路 弹出相应广告 以下是一段php判断搜索引擎的代码 <?PHP $referer $_SERVER[HTTP_REFERER]; if(!$referer ){ if(ereg(http,$referer)){ $referer eXPlode(.,$referer); if(is_array($referer)){ $referer $referer[1]; if($referer google OR $referer b…

redis mysql查询数据类型_linux 常见的标识与Redis数据库详解
xxxxxx:~$ :第一个 xxx 只的是 用户名第二个 xxx 代表的是 HOST主机~ : 当前用户的根, 根的位置在 /home/用户名$ : 代表当前用户是一个普通用户# : 代表当前用户是超级用户查看当前命令所在的位置pwd文件夹/文件的常见命令mkdirlsrmdirrm创建文件夹mkdirmkdir test…

/etc/hosts/中HOSTNAME错误导致lsnrctl启动错误
系统环境:REDHAT LINUX5.4 ORACLE10.2.0.4,是通过虚拟机复制另外一台数据库系统环境后安装ORACLE获得。故障现象:ORACLE安装正常,本地服务正常,本地数据通过IMP可以正常导入,但是LSNRCTL能够启动ÿ…

16_python_面向对象
一、面向对象和面向过程的区别1、面向对象:一切以对象为中心。有相同属性和动作的结合体叫做对优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易…

怎么用canvas画秒针_用canvas画一个钟表
body{background: #000000;}#c1{background: #FFFFFF;}span{color: #FFFFFF;}var oCdocument.getElementById("c1");var oGcoC.getContext(2d);setInterval(function(){ //循环计时器每一秒调用一次,相当于每隔一秒画一次表盘oGc.clearRect(0,0,oC.offset…

每日英语:China's Labor Market Tightens
Job cuts in China appear to be on the rise, dimming prospects for a labor market that has been a resilient bright spot amid a slowdown in the worlds second-largest economy. dimming:调光;变暗 resilient: 弹回的…

大数据-spark-hbase-hive等学习视频资料
不错的大数据spark学习资料,连接过期在评论区评论,再给你分享 https://pan.baidu.com/s/1ts6RNuFpsnc39tL3jetTkg 转载于:https://www.cnblogs.com/xjh713/p/9704251.html

redis学习 -- 简单动态字符串
Redis没有使用C语言字符串的形式,通过’\0’作为结尾,而是使用了简单动态字符串(simple dynamic string)。 当Redis使用的字符串不需要修改字符串的内容的时候,可以使用C语言提供的字符串,当需要修改内容的时候就使用的是简单动态…
【stanford C++】容器III——Vector类
主要介绍如下5个容器类——Vector, Stack,Queue,Map和Set,各个都表示一重要的抽象数据类型。另外,各个类都是一些简单类型的值的集合,所以称它们为容器类。 暂且我们先不需要知道它们是如何实现的ÿ…

linux编译安装mysql 5.1_linux编译安装mysql5.1.x
安装mysql,安装前准备如果mysql用户不存在,那么添加mysql用户groupadd mysqluseradd -g mysql mysqlmysql编译安装make时间特别长wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.70.tar.gztar -zxvf mysql-5.1.70.tar.gzcd mysql-5.1.70…

Windows PowerShell 批量迁移Windows用户信息
这里说一下我在服务器上本地用户帐号、组的迁移 这里用到的迁移工具是 Windows PowerShell 迁移支持虚拟机和实体机器的迁移,虚拟机和虚拟机的迁移 但是不支持不同语种之间的迁移,比如英语向中文迁移 这里我实验的是虚拟机和虚拟机的迁移 系统是Windows…

css中position的几个值
1. staitic:该值符合文档的初始排版,其中设置的与位置有关的值不起作用。2.relative 该值的偏移量,是在文档初始排版的基础上进行排版,并且覆盖顺序是最新输出的在最上面3.absolute该值元素的定位是以网页文档左上角位基准,并且不…

一个较为详细的ETL系统实现方案
转至:http://www.cognoschina.net/club/viewthread.php?tid5627 1 ETL流程及调度设计(ETL Schedule)(PSP)1. ETL调度的目标快速见效系统要抽取39家分行四个系统的数据进行加工处理,数据从下传文件到ODS库,ODS库到LDM&…

python与anaconda区别_anaconda和python的区别是什么?
anaconda和python的区别是什么?Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。使用python需要下载安装执行python代码的环境。官方的Python包含了核心的模块和库,为了完成其他任务,需要安装其他的模块和库。Anaconda 是Py…

opencv 1 图像载入、显示和输出
三个函数 imread() namedWindow() inshow()1. imread 函数原型: Mat imread(const string& filename, int flags 1 );参数解析: const string& finename 将要载入的图片路径名。 Windows操作系统下面支持如下类型的图片: Window…

英文申请书范例
Dear Sir or Madam, I am applying for the position of Executive Assistant as advertised in the Recruitment Daily last evening. 我来应聘昨天晚上在每日招聘上发布的行政助理一职。 I have over five years of experience within this role during which time I have de…

c++ ofstream使用方法
ofstream是从内存到硬盘,ifstream是从硬盘到内存,流缓冲即是内存空间。 插入器<< : 向流输出数据。 cout << "test!" << endl; 将字符串输出到标准输出流。 析取器>> : 从流中输入数据 cin >> x; 从标准输入流…

JAVA 继承内存模型_Java内存模型
JVM的组成类加载器(classloader)执行引擎(execution engine)运行时数据区域(runtime data area)对于Java程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C程序开发程序员这样为内一个new 操作去写对应的delete/free操作,不容易出现内存泄…

Error: The INF file contains Unicode characters that could not be converted correctly
昨天第一次为自己的windows mobile程序制作CAB安装包,但是在生成过程中,却出现了这样一个问题:编译完成 -- 0 个错误,0 个警告time -> G:\WindowsMobile\time\time\bin\Debug\time.exe------ 正在启动项目“SmartDeviceCab1”的…

嵌入式开发板设置无密码登录
本次配置需要修改的ssh登录的配置文件 vi /etc/ssh/sshd_config允许root用户远程登录 设置PermitRootLogin参数值为yes #LoginGraceTime 2m PermitRootLogin yes #StrictModes yes #MaxAuthTries 6 #MaxSessions 10允许无密码登录 设置PermitEmptyPasswords 参数值修改为ye…

2012/08/27 夜
杂记于2012/08/27 唉,,最近公司在搬家,一直没有时间来看技术方面的资料,丫的上个星期天还接到第二天凌晨3点钟呢。。。唉。。有点受不了啊。。这苦逼的运维工作,,,呵,来说说这其中让…

存储过程和函数 PROCEDURE FUNCTION
SQL语句执行的时候,要首先编译,然后在被执行。在大型数据库系统中,为了提高效率,将为了完成特定功能的SQL语句集进行编译优化后,存储在数据库服务器中,用户通过指定存储过程的名字来调用执行。 具体而言&am…
Android——学习:线性布局权重分配
LinearLayout在Android中被广泛使用,LinearLayout有一个比较重要的属性——android:layout_weight。按照字面理解就是该控件的权重,这个值默认是 零(0)。 举个例子: 在下图中,整个界面是一个Linearlayout&a…

java bean配置文件_Spring中多配置文件及引用其他bean的方式
Spring多配置文件有什么好处?按照目的、功能去拆分配置文件,可以提高配置文件的可读性与维护性,如将配置事务管理、数据源等少改动的配置与配置bean单独分开。Spring读取配置文件的几种方式:1、使用Spring自身提供的ApplicationCo…

putty 串口登录开发板
安装putty 多个平台均可以安装putty pc端配置 使用串口线连接开发板 ls /dev 查看是否出现类似于ttyUSBx的文件 sudo putty 弹出页面,选择Serial Serial line填写/dev/ttyUSBx Speed填写115200(根据不同开发板,选择不同参数) 依次点击Load࿰…