random、面向对象编程
一、random模块:随机数
import random
print random.random()
print random.randint(,)
print random.randrange(,) print chr() #实现字母和数字的相互转换
print ord("y") num = random.randrange(,) #生成随机字母
print chr(num) ##################
生成验证码示例
import random
checkcode = ''
for i in range():
current = random.randrange(,)
if current != i:
temp = chr(random.randint(,))
else:
temp = random.randint(,)
checkcode += str(temp)
print checkcode
二、面向对象三大特性之封装
self 表示实例化之后的实例
###########################
python __init__方法传参数的两种方法:
、
#!/usr/bin/env python
# _*_ coding:utf- _*_ # #### 定义类 #### class DbHelper(object): def __init__(self): #固定
self.hostname = '1.1.1.1'
self.port =
self.password = 'pwd'
self.username = 'root' def fetch(self):
# 连接数据库
# 拼接sql语句
# 操作
print self.hostname
pass def create(self):
# 连接数据库
# 拼接sql语句
# 操作
print self.username
pass def remove(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def modify(self):
# 连接数据库
# 拼接sql语句
# 操作
pass # #### 操作类 #### db = DbHelper()
db.create() # ##################### 定义类 #####################
、
class Person: def __init__(self, na, gen, age, fig): #实例化传参
self.name = na
self.gender = gen
self.age = age
self.fight =fig def grassland(self):
"""注释:草丛战斗,消耗200战斗力""" self.fight = self.fight - # ##################### 创建实例 ##################### cang = Person('苍井井', '女', , ) # 创建苍井井角色
dong = Person('东尼木木', '男', , ) # 创建东尼木木角色
bo = Person('波多多', '女', , ) # 创建波多多角色
三、面向对象三大特性之继承
类的继承只与类有关系,与对象没有关系
类的多继承:多继承只是python的特性,在其他语言中不支持;(实际没有什么卵用,但是在面试的时候可能会用到)
经典类:深度优先
新式类:广度优先
########################
经典类
class D:
def bar(self):
print "D.bar" class C(D): def bar(self):
print 'C.bar' class B(D):
pass class A(B,C): #深度优先,经典类
pass a = A()
a.bar()
##############################
新式类 class D(object):
def bar(self):
print "D.bar" class C(D): def bar(self):
print 'C.bar' class B(D):
pass class A(B,C): #深度优先,经典类
pass a = A()
a.bar()
四、面向对象类成员之字段
类成员:
字段:普通字段、静态字段
方法:普通方法、类方法、静态方法
属性:普通属性
class Person(object):
def __int__(self,name,age):
self.name = name #普通字段
self.age = age
def func(self):
return '123'
@property #属性,将方法伪造为字段
def att(self):
return '123' obj = Person('Charles',22)
obj.func()
#obj.att '''
class Province():
contry = "中国" #静态字段
def __init__(self,name):
self.name = name shanxi = Province('山西')
shanxi.contry
'''
#####################属性########################
属性相当于将类的方法转换为字段,可以直接使用访问类的字段的方式访问属性
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
class Person(object):
def __init__(self,name,salary):
self.name = name #普通字段
self.salary = salary def func(self):
return '123'
@property #属性,将方法伪造成字段,可以使用字段的方法去访问了
def att(self):
return '123'
@property
def compute(self):
return '66666'
obj = Person('Charles',20000)
print obj.name obj.func()
print obj.compute
obj.att 结果为:
E:\python\python.exe E:/python_scripts/11S_07day/index.py
Charles
66666
123
###################普通字段和静态字段####################
#!/usr/bin/env python
# _*_ coding:utf- _*_
class Person(object):
def __init__(self,name,salary):
self.name = name #普通字段,保存在对象里面
self.salary = salary def func(self):
return ''
@property #属性,将方法伪造成字段,可以使用字段的方法去访问了
def att(self):
return ''
@property
def compute(self):
return ''
obj = Person('Charles',)
print obj.name obj.func()
print obj.compute
obj.att class Province(object): county = "中国" #静态字段,保存在类里面,所有的对象都可以访问
def __init__(self,name):
self.name = name shanxi = Province("山西")
shandong = Province("山东")
print id(shanxi.county)
print id(shandong.county) 结果为:
E:\python\python.exe E:/python_scripts/11S_07day/index.py
Charles #静态字段的内存地址相同
普通字段:是保存在对象中的
静态字段:是保存在类中的
所以在访问的时候,建议访问普通字段的使用对象访问,访问静态字段的时候使用类访问(在其他语言中,静态字段只能使用类进行访问);
class Province(object): county = "中国" #静态字段,保存在类里面,所有的对象都可以访问
def __init__(self,name):
self.name = name shanxi = Province("山西")
shandong = Province("山东")
print id(shanxi.county)
print id(shandong.county)
print id(Province.county)
print Province.county #使用类访问静态字段
五、面向对象成员之方法
self为形式参数
######################类方法##########################
#!/usr/bin/env python
# _*_ coding:utf-8 _*_ class Province(object):
def f1(self): #普通方法,对象调用
pass @classmethod #类方法,对类方法进行了约束:是能有一个参数,参数把当前类传进来
def f2(cls): #参数只能有一个,且必须为cls,由类调用,cls相当于class
print cls
pass @staticmethod #静态方法;类+静态方法=函数,为其他语言使用函数式编程提供了方法
def f3(s1,a1): #由类调用,参数随便写
pass Province.f2()
Province.f3(11,22) 结果为:
E:\python\python.exe E:/python_scripts/11S_07day/index1.py
<class '__main__.Province'>
六、面向对象成员之属性
python的属性使用的较少,原因是不像其他语言的那么强大
使用方法:
方法前面加@proproty
参数只能有self
调用时不能用括号
应于实例:
现在有这样有一种需求,在向数据库请求数据的时候,页面展示只能一次性展示10行,那么在每次就从数据库中读取10行,如何将需要展示的行数读取出来? class Pager:
def __init__(self,current_page):
self.current_page = current_page
self.per_items = @property
def start(self):
val = (self.current_page - ) * self.per_items
return val
@property
def end(self):
val = self.current_page * self.per_items
return val P = Pager()
print P.start
print P.end SQL语句就可以书写如下:
#select * from a limit p.start:p.end
属性的另一种表达方式,与上述@property的效果相同
class Foo:
def get_bar(self):
return 'Charles'
BAR = property(get_bar) #属性的另一种使用方式,通过BAR访问get_bar obj = Foo()
result = obj.BAR
print result 结果为:
charles
注意:不管是经典类还是新式类都可以使用装饰器
其他装饰器:(只在新式类中使用)
class Goods(object):
@property
def price(self):
print "@property" @price.setter
def price(self,value):
print "@price.setter" @price.deleter
def price(self):
print "@price.deleter" ##############调用################### obj = Goods() obj.price #自动执行@proproty修饰的方法,并获取返回值
print obj.price obj.price = #自动执行@price.setter修饰的price方法,将123赋值给方法的返回值 print obj.price del obj.price #自动执行@price.deleter修饰的price方法 print obj.price
结果为:
E:\python\python.exe E:/python_scripts/11S_07day/index1.py
@property
@property
None @property
None
七、面向对象类成员修饰符
所有__开头的都表示是私有,不可以直接访问
class Foo(object):
__country = "China" #私有静态字段,无法直接访问 def __init__(self):
self.__name = "Charles" #私有普通字段 def __foo(self): #私有普通方法
print "foo" @staticmethod
def __fat(): #私有静态方法
print "fat" def func(self):
print Foo.__country #可以间接访问
print self.__name
self.__foo()
Foo.__fat()
obj = Foo()
obj.func() 结果为:
E:\python\python.exe E:/python_scripts/11S_07day/index1.py
China
Charles
foo
fat
那么对于继承呢?
class Foo(object):
__county = "China" def __init__(self):
self.__name = "Charles" def func(self):
print Foo.__county #class Son(Foo):
# def show(self):
#print Foo.__county #子类无法访问主类的私有字段或方法,这种方法不对
#s = Son()
#s.show() obj = Foo()
print obj._Foo__name #如果非要访问,可以用这种方式,但是极为不推荐这种方式
总结:
1、面向对象三大特性
2、python、封装
a、多个方法公用一组变量,变量封装到变量中
b、游戏
3、继承
a、基类、派生类
b、多继承
c、新式类、经典类
d、广度优先、深度优先
4、类、对象内存的图
5、类成员
a、字段:普通、静态
b、方法
普通方法 对象 参数至少一个self,self=当前对象
类方法 类 只有一个cls,cls=当前类
静态方法 类 任意参数
c、属性:方法的变种,变成访问时字段相似
@property
Data=property(方法名)
@property
@方法名:setter
@方法名:deleter
八、类特殊方法
__doc__
__call__
class Foo(object):
"""
audgsdksadhkashd """
__country = "China" def __init__(self):
self.name = "Charles"
self.age = 22 def __call__(self, *args, **kwargs):
print "call" def get_name(self):
return self.__name
obj = Foo() #类加()执行__init__方法
obj() #对象加()执行__call__方法 Foo()()
print obj.__doc__
print obj.__dict__ #查看类中的字段有哪些,放入字典中
print Foo.__dict__ ###########################
E:\python\python.exe E:/python_scripts/11S_07day/index1.py
call
call audgsdksadhkashd {'age': 22, 'name': 'Charles'}
{'__dict__': <attribute '__dict__' of 'Foo' objects>, '__module__': '__main__', '_Foo__country': 'China', '__init__': <function __init__ at 0x0212A7F0>, '__call__': <function __call__ at 0x0212A770>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': '\n audgsdksadhkashd\n\n ', 'get_name': <function get_name at 0x0212A730>}
__str__
class Foo(object):
"""
audgsdksadhkashd """
__country = "China" def __init__(self):
self.name = "Charles"
self.age = 22 def __call__(self, *args, **kwargs):
print "call" def get_name(self):
return self.__name
obj = Foo()
print obj 结果为:
<__main__.Foo object at 0x02159A30> #返回的是内存地址 如果加__str__函数 class Foo(object):
"""
audgsdksadhkashd """
__country = "China" def __init__(self):
self.name = "Charles"
self.age = 22 def __str__(self):
return "QQ" def __call__(self, *args, **kwargs):
print "call" def get_name(self):
return self.__name obj = Foo()
print obj 结果为:
九、使用反射访问、设置类的属性(一般用不到,只有在一些框架中才会使用得到)
>>> class A:
... a = 0
... def __init__(self):
... self.a=10
... self.b=100
...
...
...
>>>
>>>
>>> a = A() >>> getattr(a,'a')
10
>>> setattr(a,'a',20) #设置属性
>>> getattr(a,'a')
20 >>> hasattr(a,'b') #判断有无属性
True
十、属性包装(让类的方法包装为属性)
一般属性包装使用装饰器实现,比如property(可读), .setter(可写)和.delete(删除)等
class Washer: def __init__(self,water=10,scour=2):
self._water=water
self._scour=scour
self.year=2010 @property
def water(self): #将方法封装为属性
return self._water @water.setter
def water(self,water):
if 0<water <=500:
self._water = water
else:
print "set Failure!" @property
def total_water(self):
return 2015-self.year if __name__ == '__main__':
w = Washer()
print w.water
w.water= -123
print w.water #直接通过访问属性的方式访问方法
print w.total_water
random、面向对象编程的更多相关文章
- Python之路【第五篇】:面向对象编程
面向对象编程思维导向图
- C#面向对象编程基础-喜课堂笔记
**************[5][C#面向对象编程基础]第1讲:类与对象**************** *************2.1.1_类与对象的概念**** ...
- 《JavaScript面向对象编程指南(第2版)》读书笔记(二)
<JavaScript面向对象编程指南(第2版)>读书笔记(一) <JavaScript面向对象编程指南(第2版)>读书笔记(二) 目录 一.基本类型 1.1 字符串 1.2 ...
- java 面向对象编程。。。。
经过一周的学习(java),总结了许多,对java的理解,java的类型,运用,安装,基础语法,变量,常量,表达式,语句 java从C语言中继承了大量语言特性.java面向对象编程的基本特征,包括继承 ...
- 页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作
页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...
- JavaScript面向对象编程[转]
JavaScript面向对象编程 命名空间 命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑所有的功能. 在JavaScript中,命名空间只是另一个包含方法,属性,对象的对 ...
- Java基础-初识面向对象编程(Object-Oriented-Programming)
Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...
- js面向对象编程-高级内容
JavaScript面向对象 一.为每个对象动态添加属性或方法 功能:返回对象类型原型的引用 prototype的使用 格式:class.prototype 场景: 比如说:A写了一个类,交给B,B在 ...
- JavaScript面向对象编程小游戏---贪吃蛇
1 面向对象编程思想在程序项目中有着非常明显的优势: 1- 1 代码可读性高.由于继承的存在,即使改变需求,那么维护也只是在局部模块 1- 2 维护非常方便并且成本较低. 2 这个demo是采用了 ...
- Day07:常用模块,面向对象编程(对象&类)及内置函数
今日内容:1.常用模块2.面向对象编程(*****) 介绍面向对象编程 类 对象3.内置函数------------------------------1.面向过程编程 核心“ ...
随机推荐
- SQL视图与触发器
视图(虚拟的表) select查询出来的结果集可以用as起别名当作虚拟表来使用 视图只能添加使用不能添加修改 视图不能建在其他视图上,只能一其他实体表作为基础 视图表的数据会随实体表的变动而变动 视图 ...
- Scalding初探之一:基于Scala的Hadoop利器
把你从写繁琐的Map-reduce Job中解放出来,写分布式跟写本地程序没两样,Scala真真代表着先进生产力的方向啊. 好的,今天开始直播基于Scala的Scalding啦,循序渐进地看以下页面: ...
- HDU 2509 nim博弈
Be the Winner Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- listview分页加载
package com.baway.test; import java.util.ArrayList; import com.baidu.vo.Mydata;import com.baidu.vo.S ...
- 转:配置nodemanager启动weblogic服务器
下面仅供参考,里面表格还有文件目录我是写的linux,刚刚看到原作者是windows, 后面我会把自己配置nodemanager的经过记录上来,我搞得是linux. (一)通过nodemanager本 ...
- 使用Firefox user agent进行移动端网页测试
Selenium 真是个强大的网页测试工具,设置Firefox user agent, 就可以轻松模拟手机端浏览器进行网页测试. Demo Code # -*- coding:utf8 -*- imp ...
- 知识积累:DAS NAS SAN
DAS(Direct Acess Storage—直接连接存储)是指将存储设备通过SCSI接口或光纤通道直接连接到一台计算机上.NAS(Network Attached Storage)—网络连接存储 ...
- BufferedReader需要显示关闭
BufferedReader reader = new BufferedReader(); …… reader.close(); BufferedReader需要显示关闭 解释: 方法调用结束后,这两 ...
- SpringMVC学习系列(1) 之 初识SpringMVC
1.前言: 与SpringMVC的结识源于个人之前想做一个微信公众账号的管理平台玩玩,既然要做就需要考虑平台的选择问题.由于我的朋友只有一台运行了Linux系统的虚拟主机,且上面还运行有他自己的一些论 ...
- LeetCode "Integer Break"
A typical CS style DP based solution: class Solution(object): def __init__(self): self.hm = {} def i ...