当前位置: 首页 > 编程日记 > 正文

16_python_面向对象

一、面向对象和面向过程的区别
1、面向对象:一切以对象为中心。有相同属性和动作的结合体叫做对
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低
2、面向过程:一切以实物的流程为中心
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
二、面向对象的编写
1 class Car:     #  class是关键字,表示类
2     def __init__(self, color, pai, pailiang): # self表示当前类的对象. 当前你创建 的是谁, 谁来访问的这个方法.那这个self就是谁.
3             self.color = color
4             self.pai = pai        
5             self.pailiang = pailiang
6     def run(self, speed):
7             print("车可以跑%s迈" % speed)
8 c = Car("red", "京A66666", "2.0T")   # 创建对象,类名称后加括号即可,即为实例化
9 c.run(100) # 这时. python会自动把对象c传递给run方法的第一个参数位置.

1、面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能;对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
2、类中的函数第一个参数必须是self(详细见:类的三大特性之封装);类中定义的函数叫做 “方法”
实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
 1 class 类名:
 2     def __init__(self,参数1,参数2):
 3         self.对象的属性1 = 参数1
 4         self.对象的属性2 = 参数2
 5 
 6     def 方法名(self):pass
 7 
 8     def 方法名2(self):pass
 9 
10 对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
11                   #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
12                   #括号里传参数,参数不需要传self,其他与init中的形参一一对应
13                   #结果返回一个对象
14 对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
15 对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可
三、面向对象的三大特征 -- 封装、继承和多态
1、封装
封装:  把很多数据封装到一个对象中.  把固定功能的代码封装到一个代码块, 函数, 对象,  打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了一个很牛B 的函数. 那这个也可以被称为封装.  在面向对象思        想中. 是把一些看似无关紧要的内容组合到一起统一进行行存储和使用. 这就是封装.
2、继承
(1) 单继承
子类可以自动拥有父类中除了私有属性外的其他所有内容
class DerivedClassName(BaseClassName1):<statement-1>. . .<statement-N>

需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法

 1 #类定义
 2 class people:
 3     #定义基本属性
 4     name = ''
 5     age = 0
 6     #定义私有属性,私有属性在类外部无法直接进行访问
 7     __weight = 0
 8     #定义构造方法
 9     def __init__(self,n,a,w):
10         self.name = n
11         self.age = a
12         self.__weight = w
13     def speak(self):
14         print("%s 说: 我 %d 岁。" %(self.name,self.age))
15 #单继承示例
16 class student(people):
17     grade = ''
18     def __init__(self,n,a,w,g):
19         #调用父类的构函
20         people.__init__(self,n,a,w)
21         self.grade = g
22     #覆写父类的方法
23     def speak(self):
24         print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
25 
26 s = student('ken',10,60,3)
27 s.speak()
28 结果:
29 ken 说: 我 10 岁了,我在读 3 年级

(2) 多继承

class DerivedClassName(Base1, Base2, Base3):<statement-1>. . .<statement-N>

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。(MRO算法)

 1 #类定义
 2 class people:
 3     #定义基本属性
 4     name = ''
 5     age = 0
 6     #定义私有属性,私有属性在类外部无法直接进行访问
 7     __weight = 0
 8     #定义构造方法
 9     def __init__(self,n,a,w):
10         self.name = n
11         self.age = a
12         self.__weight = w
13     def speak(self):
14         print("%s 说: 我 %d 岁。" %(self.name,self.age))
15 #单继承示例
16 class student(people):
17     grade = ''
18     def __init__(self,n,a,w,g):
19         #调用父类的构函
20         people.__init__(self,n,a,w)
21         self.grade = g
22     #覆写父类的方法
23     def speak(self):
24         print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
25 #另一个类,多重继承之前的准备
26 class speaker():
27     topic = ''
28     name = ''
29     def __init__(self,n,t):
30         self.name = n
31         self.topic = t
32     def speak(self):
33         print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
34 #多重继承
35 class sample(speaker,student):
36     a =''
37     def __init__(self,n,a,w,g,t):
38         student.__init__(self,n,a,w,g)
39         speaker.__init__(self,n,t)
40 test = sample("Tim",25,80,4,"Python")
41 test.speak()   #方法名同,默认调用的是在括号中排前地父类的方法
42 结果:
43 我叫 Tim,我是一个演说家,我演讲的主题是 Python
(3) 方法重写
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法
1 class Parent:        # 定义父类
2    def myMethod(self):
3       print ('调用父类方法')
4 class Child(Parent): # 定义子类
5    def myMethod(self):
6       print ('调用子类方法')
7 c = Child()          # 子类实例
8 c.myMethod()         # 子类调用重写方法
9 super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
3、多态
多态: 同一个对象, 多种形态. 这个在python中其实是很不容易说明白的. 因为我们一 直在用. 只是没有具体的说.  比如. 我们创建一个变量a = 10 , 我们知道此时a是整数类型. 但是我们可以通过程序让a = "alex", 这时, a又变成了字符串类型.  这是我们都知道的. 但是, 我要告诉你的是. 这个就是多态性. 同一个变量a可以是多种形态.
 1 class Animal:    
 2     def chi(self):
 3         print("动物就知道吃")
 4 class Pig(Animal):
 5     def chi(self):
 6             print("猪在吃")
 7 class Haski(Animal):
 8     def chi(self):
 9             print("哈?士奇在吃")
10 class Alasika(Animal):
11     def chi(self):       
12         print("阿拉斯加在吃")
13 class SiYangYuan:
14     def yanng_animal(self, ani):  
15         ani.chi()
16         
17 zhu = Pig()
18 erha = Haski()
19 ala = Alasika()
20 alex = SiYangYuan()
21 alex.yanng_animal(zhu)
22 alex.yanng_animal(erha)
23 alex.yanng_animal(ala)
程序具有超高的可扩展性.  面向对象思想的核心与灵魂. python自带多态
 
四、类对象补充
 1 一:我们定义的类的属性到底存到哪里了?有两种方式查看
 2 dir(类名):查出的是一个名字列表
 3 类名.__dict__:查出的是一个字典,key为属性名,value为属性值
 4 
 5 二:特殊的类属性
 6 类名.__name__# 类的名字(字符串)
 7 类名.__doc__# 类的文档字符串
 8 类名.__base__# 类的第一个父类(在讲继承时会讲)
 9 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
10 类名.__dict__# 类的字典属性
11 类名.__module__# 类定义所在的模块
12 类名.__class__# 实例对应的类(仅新式类中)

转载于:https://www.cnblogs.com/hq82/p/9703622.html

相关文章:

怎么用canvas画秒针_用canvas画一个钟表

body{background: #000000;}#c1{background: #FFFFFF;}span{color: #FFFFFF;}var oCdocument.getElementById("c1");var oGcoC.getContext(2d);setInterval(function(){ //循环计时器每一秒调用一次&#xff0c;相当于每隔一秒画一次表盘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&#xff1a;调光&#xff1b;变暗    resilient&#xff1a; 弹回的&#xf…

大数据-spark-hbase-hive等学习视频资料

不错的大数据spark学习资料&#xff0c;连接过期在评论区评论&#xff0c;再给你分享 https://pan.baidu.com/s/1ts6RNuFpsnc39tL3jetTkg 转载于:https://www.cnblogs.com/xjh713/p/9704251.html

redis学习 -- 简单动态字符串

Redis没有使用C语言字符串的形式&#xff0c;通过’\0’作为结尾&#xff0c;而是使用了简单动态字符串(simple dynamic string)。 当Redis使用的字符串不需要修改字符串的内容的时候&#xff0c;可以使用C语言提供的字符串&#xff0c;当需要修改内容的时候就使用的是简单动态…

【stanford C++】容器III——Vector类

主要介绍如下5个容器类——Vector&#xff0c; Stack&#xff0c;Queue&#xff0c;Map和Set&#xff0c;各个都表示一重要的抽象数据类型。另外&#xff0c;各个类都是一些简单类型的值的集合&#xff0c;所以称它们为容器类。 暂且我们先不需要知道它们是如何实现的&#xff…

linux编译安装mysql 5.1_linux编译安装mysql5.1.x

安装mysql&#xff0c;安装前准备如果mysql用户不存在&#xff0c;那么添加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 迁移支持虚拟机和实体机器的迁移&#xff0c;虚拟机和虚拟机的迁移 但是不支持不同语种之间的迁移&#xff0c;比如英语向中文迁移 这里我实验的是虚拟机和虚拟机的迁移 系统是Windows…

css中position的几个值

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

一个较为详细的ETL系统实现方案

转至&#xff1a;http://www.cognoschina.net/club/viewthread.php?tid5627 1 ETL流程及调度设计&#xff08;ETL Schedule&#xff09;(PSP)1. ETL调度的目标快速见效系统要抽取39家分行四个系统的数据进行加工处理&#xff0c;数据从下传文件到ODS库&#xff0c;ODS库到LDM&…

python与anaconda区别_anaconda和python的区别是什么?

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

opencv 1 图像载入、显示和输出

三个函数 imread() namedWindow() inshow()1. imread 函数原型&#xff1a; Mat imread(const string& filename, int flags 1 );参数解析&#xff1a; const string& finename 将要载入的图片路径名。 Windows操作系统下面支持如下类型的图片&#xff1a; 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是从内存到硬盘&#xff0c;ifstream是从硬盘到内存&#xff0c;流缓冲即是内存空间。 插入器<< : 向流输出数据。 cout << "test!" << endl; 将字符串输出到标准输出流。 析取器>> : 从流中输入数据 cin >> x; 从标准输入流…

JAVA 继承内存模型_Java内存模型

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

Error: The INF file contains Unicode characters that could not be converted correctly

昨天第一次为自己的windows mobile程序制作CAB安装包&#xff0c;但是在生成过程中&#xff0c;却出现了这样一个问题&#xff1a;编译完成 -- 0 个错误&#xff0c;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 唉&#xff0c;&#xff0c;最近公司在搬家&#xff0c;一直没有时间来看技术方面的资料&#xff0c;丫的上个星期天还接到第二天凌晨3点钟呢。。。唉。。有点受不了啊。。这苦逼的运维工作&#xff0c;&#xff0c;&#xff0c;呵&#xff0c;来说说这其中让…

存储过程和函数 PROCEDURE FUNCTION

SQL语句执行的时候&#xff0c;要首先编译&#xff0c;然后在被执行。在大型数据库系统中&#xff0c;为了提高效率&#xff0c;将为了完成特定功能的SQL语句集进行编译优化后&#xff0c;存储在数据库服务器中&#xff0c;用户通过指定存储过程的名字来调用执行。 具体而言&am…

Android——学习:线性布局权重分配

LinearLayout在Android中被广泛使用&#xff0c;LinearLayout有一个比较重要的属性——android:layout_weight。按照字面理解就是该控件的权重&#xff0c;这个值默认是 零&#xff08;0&#xff09;。 举个例子&#xff1a; 在下图中&#xff0c;整个界面是一个Linearlayout&a…

java bean配置文件_Spring中多配置文件及引用其他bean的方式

Spring多配置文件有什么好处&#xff1f;按照目的、功能去拆分配置文件&#xff0c;可以提高配置文件的可读性与维护性&#xff0c;如将配置事务管理、数据源等少改动的配置与配置bean单独分开。Spring读取配置文件的几种方式&#xff1a;1、使用Spring自身提供的ApplicationCo…

putty 串口登录开发板

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

win7下解决Android SDK Manger慢

2019独角兽企业重金招聘Python工程师标准>>> 今天准备做个Android小程序&#xff0c;以前配置的环境太久了&#xff0c;于是想配最新&#xff0c;但是花了大半天的时间遇到各种问题&#xff0c;最终还是配置好了。 1、首先修改C:\Windows\System32\drivers\etc\host…

Linux 工具进阶

参考网址 https://linuxtools-rst.readthedocs.io/zh_CN/latest/advance/index.html 转载于:https://www.cnblogs.com/artesian0526/p/9712258.html

ASP.NET MVC:利用ASP.NET MVC4的IBundleTransform集成LESS

背景 LESS确实不错&#xff0c;只是每次写完LESS都要手工编译一下有点麻烦&#xff08;VS插件一直没有安装好&#xff09;&#xff0c;昨天在官方看到了如何用IBundleTransform集成LESS&#xff0c;今天就记录一下。 参考资料&#xff1a;http://www.asp.net/mvc/tutorials/mvc…

java锁屏_JAVA设置桌面不锁屏设置

//下面是编译命令// javac -encoding utf-8 Main.javaimport javax.swing.*;import java.awt.*;import java.awt.event.*;public class Main extends WindowAdapter {JLabel label null;public Main() {JFrame jFrame new JFrame("保持打开就不会锁屏");Container …

网线直连开发板

pc 端配置 点击pc端无线链接图标编辑链接以太网编辑IPv4设置方法&#xff1a;与其他计算机共享根据putty获取的动态ip使用ssh登录 解决 ip 无法登录问题 设置 pc 端 ip 和开发板 ip 在同一个网段 比如开发板 ip 是 10.42.0.123 可以设置自己机器的 ip 为 10.42.0.11 sudo i…

linux系统中指定端口连接数限制

限制22端口只能有两个连接 [code] iptables -P INPUT DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT iptables -A INPUT -p tcp --dport 22 -j ACCEPT [/code] 在此…

PHP-错误处理

错误处理 一、错误的分类 1、语法错误&#xff1a; 程序没法运行&#xff0c;直接提示语法错误。 2、运行时错误&#xff1a; 只有程序运行到某行&#xff0c;或在某些特定的情形下运行才会发生的错误。 3、逻辑错误&#xff1a; 程序从头到尾运行都没有发生&#xff08;并提示…

C语言的变量的内存分配

今晚看了人家写的一个关于C语言内存分配的帖子&#xff0c;发现真是自己想找的&#xff0c;于是乎就收藏了。。。 先看一下两段代码&#xff1a; char* toStr() {char *s "abcdefghijkl";return s; } int main() {cout << toStr() << endl;return 0; }…

java打包_java工程打包(方式一)

1、新建工程myprojectpackage cn.zj;public class TestMain {public static void main(String[] args) {System.out.println("Hello World!");}}2、右击Java工程选择Export—>选择JAR file—>Next3、选择要打包的文件&#xff0c;不需要的文件不必打包&#xf…