暑期学习记录11
来源:互联网 发布:linux bash是什么 编辑:程序博客网 时间:2024/05/16 12:28
python之面向对象
面向对象技术简介
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 实例变量:定义在方法中的变量,只作用于当前实例的类。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟”是一个(is-a)”关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
创建类
使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,如下实例:
class ClassName:
‘类的帮助信息’ #类文档字符串
class_suite #类体
类的帮助信息可以通过ClassName.__doc__
查看。
class_suite 由类成员,方法,数据属性组成。
实例
以下是一个简单的Python类实例:
#!/usr/bin/python# -*- coding: UTF-8 -*-class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary
empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Employee.empCount 访问。
第一种方法
__init__()
方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
需要注意的地方:继承语法 class 派生类名(基类名)://… 基类名写在括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作”多重继承” 。
语法:
#!/usr/bin/python# -*- coding: UTF-8 -*-class Parent: # 定义父类 parentAttr = 100 def __init__(self): print "调用父类构造函数" def parentMethod(self): print '调用父类方法' def setAttr(self, attr): Parent.parentAttr = attr def getAttr(self): print "父类属性 :", Parent.parentAttrclass Child(Parent): # 定义子类 def __init__(self): print "调用子类构造方法" def childMethod(self): print '调用子类方法 child method'c = Child() # 实例化子类c.childMethod() # 调用子类的方法c.parentMethod() # 调用父类方法c.setAttr(200) # 再次调用父类的方法c.getAttr() # 再次调用父类的方法
基础重载方法
下表列出了一些通用的功能,你可以在自己的类重写:
运算符重载
Python同样支持运算符重载,实例如下:
#!/usr/bin/pythonclass Vector: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return 'Vector (%d, %d)' % (self.a, self.b) def __add__(self,other): return Vector(self.a + other.a, self.b + other.b)v1 = Vector(2,10)v2 = Vector(5,-2)print v1 + v2以上代码执行结果如下所示:Vector(7,8)
类属性与方法
类的私有属性
__private_attrs
:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
类的方法
在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
类的私有方法 __private_method
:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods
ython不允许实例化的类访问私有数据,但你可以使用 object._className__attrName 访问属性(伪私有)
#!/usr/bin/python# -*- coding: UTF-8 -*-class JustCounter: __secretCount = 0 # 私有变量 publicCount = 0 # 公开变量 def count(self): self.__secretCount += 1 self.publicCount += 1 print self.__secretCountcounter = JustCounter()counter.count()counter.count()print counter.publicCountprint counter.__secretCount # 报错,实例不能访问私有变量#替换最后一行:.........................print counter._JustCounter__secretCount
Python super() 函数
描述
super() 函数用于调用下一个父类(超类)并返回该父类实例的方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
语法
以下是 super() 方法的语法:
super(type[, object-or-type])
参数
type -- 类。object-or-type -- 类,一般是 self
返回值
无。
实例
#!/usr/bin/python# -*- coding: UTF-8 -*-class FooParent(object): def __init__(self): self.parent = 'I\'m the parent.' print 'Parent' def bar(self,message): print message,'from Parent'class FooChild(FooParent): def __init__(self): # super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类B的对象 FooChild 转换为类 FooParent 的对象 super(FooChild,self).__init__() print 'Child' def bar(self,message): super(FooChild, self).bar(message) print 'Child bar fuction' print self.parentif __name__ == '__main__': fooChild = FooChild() fooChild.bar('HelloWorld')执行结果:ParentChildHelloWorld from ParentChild bar fuctionI'm the parent.
python练习实例1:
题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列
①使用列表:#!/usr/bin/python# -*- coding: UTF-8 -*-# 原答案没有指出三位数的数量,添加无重复三位数的数量d=[]for a in range(1,5): for b in range(1,5): for c in range(1,5): if (a!=b) and (a!=c) and (c!=b): d.append([a,b,c])print "总数量:", len(d)print d②使用自带函数#!/usr/bin/env python3# -*- coding:utf-8 -*-from itertools import permutationsfor i in permutations([1, 2, 3, 4], 3):#i返回的是长度为3的不重复数字的集合 k = '' for j in range(0, len(i)): k = k + str(i[j])#将元素转化成字符然后连接起来 print (int(k))#可不转换类型结果:123124132134142143213214231234241243312314321324341342412413421423431432
Python 练习实例2
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
①利用列表索引一一对应,比if-elif-else简洁#!/usr/bin/python# -*- coding: UTF-8 -*-i = int(raw_input('净利润:'))arr = [1000000,600000,400000,200000,100000,0]rat = [0.01,0.015,0.03,0.05,0.075,0.1]r = 0for idx in range(0,6): if i>arr[idx]: r+=(i-arr[idx])*rat[idx] print (i-arr[idx])*rat[idx] i=arr[idx]print r
Python 练习实例3
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
程序分析:
假设该数为 x。
1、则:x + 100 = n2, x + 100 + 168 = m2
2、计算等式:m2 - n2 = (m + n)(m - n) = 168
3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数
4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。
5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。
6、由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1。
7、接下来将 i 的所有数字循环计算即可。
①按照程序分析:#!/usr/bin/python# -*- coding: UTF-8 -*-for i in range(1,85): if 168 % i == 0: j = 168 / i; if i > j and (i + j) % 2 == 0 and (i - j) % 2 == 0 : m = (i + j) / 2 n = (i - j) / 2 x = n * n - 100 print(x)②直接从题目信息中用遍历查找:#!/usr/bin/python# -*- coding: UTF-8 -*-for m in range(168): for n in range(m): if (m+n)*(m-n)==168: x=n**2-100 print "符合条件的整数有:",x③利用集合方法:#!/usr/bin/python# -*- coding: UTF-8 -*-#X1=N*2-100的合集x1 = map(lambda i:i**2-100,range(1,100))#X2=M*2-100-168的合集x2 = map(lambda i:i**2-100-168,range(1,100))#两个合集求并集结果print set(list(x1)) & set(list(x2))
- 暑期学习记录11
- 暑期学习记录01
- 暑期学习记录02
- 暑期学习记录03
- 暑期学习记录04
- 暑期学习记录05
- 暑期学习记录06
- 暑期学习记录07
- 暑期学习记录08
- 暑期学习记录09
- 暑期学习记录10
- 暑期学习记录12
- 暑期学习记录13
- 暑期学习记录13
- 暑期学习记录14
- OpenStack暑期学习记录-20130719
- 暑期学习
- 暑期学习
- 排队的奶牛
- mysql 5.7.19 免安装版配置方法
- C# 排序算法
- 状态和无状态--2种服务器架构之间的比较
- Jenkins配置-打包到服务器
- 暑期学习记录11
- HTTP Header里的Range和Content-Range参数
- HDU-6092 Rikka with Subset(dp)
- Android O通信数据业务框架设计文档
- 使用Handler定时器让本地时间同步服务器
- 简单多进程和多线程版并发服务器
- linux命令学习-01
- HBase安装
- ORA-01017 invalid username/password;logon denied