有三种程序类型:

(1)面向过程:按照一定的逻辑顺序,一步步垒代码

(2)面向函数:对用常用的计算,建立函数避免重复

(3)面向对象: 函数的集合,对函数进行分类和封装

(一) 抽象

抽象: 哈巴狗, 宾利犬... 都是狗, 狗就是抽象

对象: 哈巴狗, 宾利犬, 藏獒

类的具体化叫对象, 对象的抽象叫做类

类是一个模板, 

class(类):包含了很多函数的一个模块: 如何定义类?

class class_name(object):
'define classname class'
class_suite

(object) 为父类!,,, 之后会介绍, 如果你的类没有继承任何父类, 那么默认就是object作为父类,

object是万类之源.

定义一个什么也不做的空类

class mydate(object):
'this is a very simple example class'
pass # 表示什么也不做
# 这里的类仅作为名称空间

类的方法

class dog(obect):
def greet(self): # python 类的定义中需要每个方法的声明中第一个参数是self
print('hello')

第一个参数是self, 说明调用这个方法的对象自身在调用时不需要实参跟它对应.

# 定义类dog, 有一个方法是greet
class dog(object):
def greet(self): # python 类的定义中需要每个方法的声明中第一个参数是self
print('hello') #实例创建
dog1=dog() # dog1就是实例名
dog1.greet() # 调用方法, hello

实例属性 instance attributes

class dog(object):
def setname(self,name):
self.name=name # 相当于dog.name='paul'
def greet(self):
print('Hi, my name is %s'%self.name)
if __name__=='__main__': # 可以理解为一个程序的入口, 类似C中的main函数
dog1=dog()
dog1.setname('paul')
dog1.greet()

dog.name 就是实例属性

重要的__init__方法:  对象的初始化方法 __int__()

当类被调用后, python会创建实例对象,
创建完对象之后, python自动调用的第一个方法是__int__().

实例对象作为方法的第一个参数(self)被传递进去,  调用类创建实例对象时的参数都传给__int__()

class dog(object):
def __init__(self, name):
self.name=name
def greet(self):
print('Hi, my name is %s.'%self.name)
if __name__=='__main__': # 可以理解为一个程序的入口, 类似C中的main函数
dog1=dog('mike')
dog1.greet()

狗这个类是实例化之后都会自动创建名字, 每一个实例都要完成的事, 所以可以把它放到__init__方法中去.

类属性 : cnt实现统计这个类被创建的实例对象个数 , cnt 与具体的对象无关, 只跟类有关, 成为类属性, 也叫静态属性.

class dog(object):
cnt=0
def __init__(self, name):
self.name=name
dog.cnt+=1 # 修改类属性必要要用类名
def greet(self):
print('Hi, I am %s, my number id %d'%(self.name,dog.cnt)) if __name__=='__main__': # 可以理解为一个程序的入口, 类似C中的main函数
dog1=dog('sara')
dog1.greet()
dog2=dog('jason')
dog2.greet()
#Hi, I am sara, my number id 1
#Hi, I am jason, my number id 2

实例: roster 花名册

(1)__init__()方法对数据进行初始化,以班主任的姓名初始化;

(2)add():加入一个学生姓名;

(3)remove():按照姓名移除学生;

(4)print_all():输出班主任姓名和所有学生名单。

class roster(object):
"students and teacher class"
teacher = ""
students = [ ]
def __init__(self, tn = 'XY'):
self.teacher = tn
def add(self, sn):
self.students.append(sn)
def remove(self, sn):
self.students.remove(sn)
def print_all(self):
print("Teacher:",self.teacher)
print("Students:", self.students) r1=roster('scarlett')
r1.add('mike')
r1.add('jim')
r1.add('alice')
r1.add('kelly')
r1.remove('jim')
r1.print_all()
#Teacher: scarlett
#Students: ['mike', 'alice', 'kelly']

(二) 继承

在原有抽象的基础上进行修改, 生成新的抽象, 称作 继承

继承可以修改一个已经定义好的类, 将其修改生成一个新的类, 而不需要将原来的类再次实现一遍!

车--轿车, 救护车, 公共汽车...

子类的定义:

class subclassname(parentclass1):
# 多个父类 class subclassname([parentclass1,parentclass2]):
class_suite

单个父类叫做 单继承, 多个父类叫做 多继承

并不是所有的语言都支持多继承, java就不支持多继承

class dog(object):
cnt=0
def __init__(self, name):
self.name=name
dog.cnt+=1 # 修改类属性必要要用类名
def greet(self):
print('Hi, I am %s, my number id %d'%(self.name,dog.cnt)) # 定义一个子类, barkingdog, 父类是dog
# 这里, 子类重写了父类的greet() 方法
class barkingdog(dog):
def greet(self):
print('woof!I am %s, my number is %d'%(self.name,dog.cnt))
if __name__=='__main__':
dog=barkingdog('zoe')
dog.greet()
#woof!I am zoe, my number is 1

注意: 如果父类的__init__ 初始化方法被子类修改, 那么父类的初始化方法就不会被自动调用,

必须显式的写出来才会被执行.

实例:

class people:
def __init__(self,n,a,w):
self.name=n
self.age=a
self.weight=w
def speak(self):
print('%s is speaking: I am %d years old'%(self.name,self.age)) p=people('mike',10,20)
p.speak() #不用加print
print p.name
print p.age ans:
mike is speaking: I am 10 years old
mike
10

具体:

class funset: 定义类的名称
def fun1(self): self是特殊的参数,必须要有!:
#类中函数的第一个参数必须是self,类中定义的函数称为 方法, fun1就是一个方法
#do something
x=funset()#根据类funset 创建对象

为什么要用类 ,明明函数可以解决的事情?
函数与函数之间是独立的,没有共用的数据!!!
面向对象的三大特征:封装\继承\多态

1.封装

#封装:先把东西封装在某个地方,以后在拿出来调用

class funset:
def __init__(self,name,age):
self.name=name
self.age=age
x=funset('xx',19) #将'xx'与19分别封装到x self的name与 age 属性中
y=funset('yy',20)
#self是一个形式参数,执行x=funset('xx',19) 时,self等于x;执行y=funset('yy',20),self=y
#内容被封装到了x, y 中,每个对象x,y都有name age 属性, #调用封装: 通过对象直接调用被封装的内容
print x.name
print y.age #调用封装: 通过self间接调用被封装的内容
class funset:
def __init__(self, name, age):
self.name = name
self.age = age
def detail(self):
print self.name
print self.age
x = funset('xx', 18)
print x.name # 直接调用x对象的name属性
print x.age
y=funset('alex', 73)
y.detail() #间接调用, 默认将y传递给self参数,即x.detail(x)

解释__init__:init 创建完对象之后,pyhton会自动调用的方法,通过两个例子可以秒懂:

例1:

class dog(object):
'define dog class'
def setname(self,name):
self.name=name #传递形参的效果:dog.name='wangcai'
def greet(self):
print('hi, my name is %s'%self.name)
if __name__=='__main__':#程序的入口,类似c语言中的main函数
dog1=dog()
dog1.setname('wangcai') #将参数传递给形参,
#传递形参的效果:dog.name='wangcai'
dog1.greet() ans:hi, my name is wangcai

例2:

class dog(object):
'define dog class'
def __init__(self,name): #实例化之后会自动取名字
#定义init,
self.name=name
def greet(self):
print('hi, my name is %s'%self.name)
if __name__=='__main__':
dog1=dog('haha')#要是没有init那么 只能用dog1=dog(),dog1=dog('haha')中的haha传递不进去的
dog1.greet()

练习1;

请输出:

小明,10岁,男,上山去砍柴
小明,10岁,男,开车去东北
小明,10岁,男,下山采蘑菇
老李,90岁,男,上山去砍柴
老李,90岁,男,开车去东北
老李,90岁,男,下山采蘑菇

方法一:面向函数

编写三个函数即可:

def kanchai(name, age, gender):
print "%s,%s岁,%s,上山去砍柴" %(name, age, gender) def qudongbei(name, age, gender):
print "%s,%s岁,%s,开车去东北" %(name, age, gender) def mogu(name, age, gender):
print "%s,%s岁,%s,下山采蘑菇" %(name, age, gender) kanchai('小明', 10, '男')
qudongbei('小明', 10, '男')
mogu('小明', 10, '男')
kanchai('老李', 90, '男')
qudongbei('老李', 90, '男')
mogu('老李', 90, '男')

方法二:面向对象

class funset:
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
def kanchai(self):
print '%s,%s岁,%s,上山砍柴'%(self.name,self.age,self.gender)
def qudongbei(self):
print '%s,%s岁,%s,开车去东北'%(self.name,self.age,self.gender)
def mogu(self):
print '%s,%s岁,%s,下山采蘑菇'%(self.name,self.age,self.gender)
xm=funset('小明',10,'男')
xm.kanchai()
xm.qudongbei()
xm.mogu()

练习二:
创建三个游戏人物:
水,女,18,初始战斗力1000
木,男,20,初始战斗力1800
山,女,19,初始战斗力2500
游戏场景,分别是:
草丛战斗,消耗200战斗力
自我修炼,增长100战斗力
多人游戏,消耗500战斗力

class person:
def __init__(self,name,gender,age,fight):
self.name=name
self.age=age
self.gender=gender
self.fight=fight
def grassland(self):
self.fight-=200
def practice(self):
self.fight+=200
def incest(self):
self.fight-=500
def detail(self):
temp='姓名:%s;性别:%s;年龄:%s;战斗力:%s'%(self.name,self.age,self.gender,self.fight)
print temp
x=person('haha','女',18,2400)
x.detail()
x.incest()
x.detail()
x.grassland()
x.detail() ans:
姓名:haha;性别:18;年龄:女;战斗力:2400
姓名:haha;性别:18;年龄:女;战斗力:1900
姓名:haha;性别:18;年龄:女;战斗力:1700

应用实例:

从给出的数据文件中,找到成绩最好的学生:

class student:
def __init__(self,name,hours,points):
self.name=name
self.hours=float(hours)
self.points=float(points)
def getname(self):
return self.name
def gethours(self):
return self.hours
def getpoints():
return self.points
def gpa(self):
return self.points/self.hours
#
#s=student('xxx',100,10)
#print s.name
#print s.getname()#两者一样 def makestudent(info):
name,hours,points=info.split('\t')
return student(name,hours,points)
def main():
f=open(r'C:\Users\xuyin\Desktop\test\info_student.txt')
best=makestudent(f.readline())
for line in f:
if makestudent(line).gpa()>best.gpa():
best=makestudent(line)
f.close()
# print('the best student is %s'%best.getname())
# print('the hours are %.2f'%best.gethours())
# print('the gpa is %.2f'%best.gpa())
print('the best student is %s'%best.name) #不需要用getname
print('the hours are %.2f'%best.hours)
print('the gpa is %.2f'%best.gpa())
#if __name__=='__main__':#这一行不需要也可以的
main()

源数据:

ans:

the best student is ccc
the hours are 120.00
the gpa is 2.51

python(8):面向对象编程的更多相关文章

  1. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  2. Python之面向对象编程学习

    不知不觉,学到了python的面向对象编程思想.今天我们来讨论下面向对象编程的思想. 顾名思义,面向对象,就是面向于对象,这里所说的对象不是你现实生活中你的女朋友,你的老婆,你的爱人,在编程的世界里面 ...

  3. Python:面向对象编程3 定制类(有更新)

    Python:面向对象编程3  定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...

  4. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  5. python之面向对象编程

    1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...

  6. Python(面向对象编程—1)

    class tst: l=[] x=1 a=tst() b=tst() a.l.append('a') b.l.append('b') a.x='a' b.x='b' print(a.l,a.x) # ...

  7. python的面向对象编程

    面向对象编程是一种程序的范式,它把程序看成是对不同对象的相互调用,对现实世界建立的一种模型. 面向对象编程的基本思想,类和实例.类用于定义抽象对象,实例根据类的定义被创建出来. 在python当中我们 ...

  8. 一文看懂Python的面向对象编程

    之前在网络上看了很多关于面向对象的编程详解,还是不够过瘾,所以决定自己动手写一篇. 面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计. 类(Class) ...

  9. python学习——面向对象编程

    关于python面向对象编程,请参考: https://blog.csdn.net/zhoudaxia/article/details/23341261

  10. Python基础 — 面向对象编程基础

    目录 1. 面向对象编程基础 2. 定义类和创建对象 3. init() 方法 4. 魔法方法 5. 访问可见性问题 5. 练习 1. 面向对象编程基础 把一组数据结构和处理它们的方法组成对象(obj ...

随机推荐

  1. python 数据分析3

    本节概要 pandas简介 安装 pip install pandas pandas的2个主要数据结构:DataFrame 和 Series Series series是一种类似于一维数组的对象,它由 ...

  2. java spring属性注入

    一.创建对象时候,向类里面属性设置值:一般有三个方式 1) .有参构造, 2). set**** 3).接口注入 二. 在spring框架里面,支持前面两种方式: 1).有参构造方法  用constr ...

  3. map中的count方法

    map.count(Key)返回值为1或者0,1返回存在,0返回不存在,返回的是布尔类型的值,因为在map类型中所有的数据的Key值都是不同的,所以被count的数要么存在1次,要么不存在

  4. pythonのgevent同步异步区别

    #!/usr/bin/env python from urllib import request import gevent from gevent import monkey import time ...

  5. [转] 浅谈Trie树(字典树)

    原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找 ...

  6. MFC修改对话框标题

    对话框标题栏内容为静态 直接在对话框属性"常规"的"Caption"中修改. 动态生成对话框标题栏内容 SetWindowText()函数就可以 CString ...

  7. DevExpress VCL 的 cxDBTreeList 的使用方法

    DevExpress VCL 的 cxDBTreeList 的使用方法:(假设控件名为: WBSTree) 1.控件WBSTree 通过绑定  DataSet 获取数据记录(Nodes),通过 Col ...

  8. awk入门【转】

    awk其实不仅仅是工具软件,还是一种编程语言.不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了. 一.基本用法 awk的基本用法就是下面的形式. # 格式 $ awk 动作 文件名 # 示 ...

  9. MySQL--表操作(innodb表字段数据类型、约束条件)、sql_mode操作

    一.创建表的完整语法 #[]内的可有可无,即创建表时字段名和类型是必须填写的,宽度与约束条件是可选择填写的.create table 表名(字段名1 类型[(宽度) 约束条件],字段名2 类型[(宽度 ...

  10. centos6.5环境wget报错Unable to establish SSL connection

    centos6.5环境wget报错Unable to establish SSL connection [root@centossz008 src]# wget --no-check-certific ...