Python面向对象进阶

一.静态方法

通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法

#静态方法
class Schoolmate(object):
    def __init__(self, name):
        self.name = name

    @staticmethod    # 把eat方法变为静态方法
    def eat(self):
        print("%s is eating" % self.name)

p= Schoolmate("LianZhiLei")
p.eat()

# Traceback (most recent call last):
#   File "C:/Users/L/PycharmProjects/s14/class/Day7/staticmothod.py", line 16, in <module>
#     p.eat()
#TypeError: eat() missing 1 required positional argument: 'self'

上面的调用会出以下错误,说是eat需要一个self参数,但调用时却没有传递,没错,当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。

想让上面的代码可以正常工作有两种办法

  • 调用时主动传递实例本身给eat方法,即p.eat(p)
  • 在eat方法中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其它变量了
#静态方法
class Schoolmate(object):
    def __init__(self, name):
        self.name = name

    @staticmethod    # 把eat方法变为静态方法
    def eat(self):
        print("%s is eating" % self.name)

p= Schoolmate("LianZhiLei")
p.eat(p)

#LianZhiLei is eating

#静态方法
class Schoolmate(object):
    def __init__(self, name):
        self.name = name

    @staticmethod    # 把eat方法变为静态方法
    def eat():
        print("is eating")

p= Schoolmate("LianZhiLei")
p.eat()

#is eating

二.类方法

类方法顾名思义跟类有关,类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

#类方法
class Schoolmate(object):
    def __init__(self, name):
        self.name = name

    @classmethod   # 把eat方法变为类方法
    def eat(self):
        print("%s is eating" % self.name)

p= Schoolmate("LianZhiLei")
p.eat()

# Traceback (most recent call last):
#   File "C:/Users/L/PycharmProjects/s14/class/Day7/classmothod.py", line 15, in <module>
#     p.eat()
#   File "C:/Users/L/PycharmProjects/s14/class/Day7/classmothod.py", line 12, in eat
#     print("%s is eating" % self.name)
# AttributeError: type object 'Schoolmate' has no attribute 'name'

执行报错如下,说schoolmat没有name属性,这是因为name是个实例变量,类方法是不能访问实例变量的,只能访问类变量

#类方法
class Schoolmate(object):
    name = ("Schoolmat的类变量")
    def __init__(self, name):
        self.name = name

    @classmethod   # 把eat方法变为类方法
    def eat(self):
        print("%s is eating" % self.name)

p= Schoolmate("LianZhiLei")
p.eat()

# Schoolmat的类变量 is eating

此时可以定义一个类变量,变量名为name即可解决

三.属性方法

属性方法的作用就是通过@property把一个方法变成一个静态属性,这个蛮有用的,后面课程会涉及到,先看代码

#属性方法

class Schoolmate(object):
    name = ("Schoolmat的类变量")
    def __init__(self, name):
        self.name = name

    @property       # 把eat方法变为属性方法
    def eat(self):
        print("%s is eating" % self.name)

p= Schoolmate("LianZhiLei")
p.eat

# Traceback (most recent call last):
#   File "C:/Users/L/PycharmProjects/s14/class/Day7/property.py", line 17, in <module>
#     p.eat()
# TypeError: 'NoneType' object is not callable

调用会出以下错误, 说NoneType is not callable, 因为eat此时已经变成一个静态属性了, 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了

#属性方法

class Schoolmate(object):
    name = ("Schoolmat的类变量")
    def __init__(self, name):
        self.name = name

    @property       # 把eat方法变为属性方法
    def eat(self):
        print("%s is eating" % self.name)

p= Schoolmate("LianZhiLei")
p.eat

#LianZhiLei is eating

好吧,把一个方法变成静态属性有什么卵用呢?既然想要静态变量,那直接定义成一个静态变量不就得了么?well, 以后我们会遇到静态变量不固定的情况,不能简单通过定义静态属性来实现的, 比如 ,你想知道一个航班当前的状态,是到达了、延迟了、取消了、还是已经飞走了, 想知道这种状态你必须经历以下几步:连接航空公司API查询、对查询结果进行解析 、返回结果给你的用户;因此这个status属性的值是一系列动作后才得到的结果,所以你每次调用时,其实它都要经过一系列的动作才返回你结果,但这些动作过程不需要用户关心, 用户只需要调用这个属性就可以,明白了么?

#属性方法实例

class Flight(object):
    def __init__(self,name):
        self.flight_name = name

    def checking_status(self):
        print("checking flight %s status " % self.flight_name)
        return  1

    @property
    def flight_status(self):
        status = self.checking_status()
        if status == 0 :
            print("flight got canceled...")
        elif status == 1 :
            print("flight is arrived...")
        elif status == 2:
            print("flight has departured already...")
        else:
            print("cannot confirm the flight status...,please check later")

f = Flight("CA980")
f.flight_status

cool , 那现在我只能查询航班状态, 既然这个flight_status已经是个属性了, 那我能否给它赋值呢?试试吧

f = Flight("CA980")
f.flight_status
f.flight_status = 2

# checking flight CA980 status
# Traceback (most recent call last):
# flight is arrived...
#   File "C:/Users/L/PycharmProjects/s14/class/Day7/flight_status.py", line 31, in <module>
#     f.flight_status = 2
# AttributeError: can't set attribute

输出, 说不能更改这个属性,我擦。。。。,怎么办怎么办。。。当然可以改, 不过需要通过@proerty.setter装饰器再装饰一下,此时 你需要写一个新方法, 对这个flight_status进行更改。

#属性方法

class Flight(object):
    def __init__(self, name):
        self.flight_name = name

    def checking_status(self):
        print("checking flight %s status " % self.flight_name)
        return 1

    @property
    def flight_status(self):
        status = self.checking_status()
        if status == 0:
            print("flight got canceled...")
        elif status == 1:
            print("flight is arrived...")
        elif status == 2:
            print("flight has departured already...")
        else:
            print("cannot confirm the flight status...,please check later")

    @flight_status.setter  # 修改     执行修改操作时触发
    def flight_status(self, status):
        status_dic = {
        0: "canceled",
        1:"arrived",
        2: "departured"
        }
        print("\033[31;1mHas changed the flight status to \033[0m", status_dic.get(status))

    @flight_status.deleter  # 删除
    def flight_status(self):
        print("status got removed...")

f = Flight("CA980")

f.flight_status = 0  # 触发@flight_status.setter 只执行setter装饰的代码
del f.flight_status  #  触发@flight_status.deleter 只执行deleter装饰的代码

执行相应的操作,触发相应的装饰器,此时不会再触发原来的属性,只执行装饰器下面的代码,需要做相应的操作可在代码块里添加(修改,删除);只是触发了而已,装饰器并没有做什么操作

四.类的特殊成员方法

① __doc__  表示类的描述信息

#__doc__

class Foo:
    """ 描述类信息,这是用于看片的神奇 """

    def func(self):
        pass

print(Foo.__doc__)

# 描述类信息,这是用于看片的神奇

②  __module__ 和  __class__

  • __module__ 表示当前操作的对象在那个模块
  • __class__     表示当前操作的对象的类是什么
# __module__ 和  __class__

class Foo:
    """ 描述类信息,这是用于看片的神奇 """

    def func(self):
        pass

A = Foo()
print(A.__module__)
print(A.__class__)

# __main__
# <class '__main__.Foo'>

③  __init__ 构造方法,通过类创建对象时,自动触发执行

④  __del__析构方法,当对象在内存中被释放时,自动触发执行

⑤  __call__ 对象后面加括号,触发执行

  注:__init__的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

# __call__

class Foo:
    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        print('__call__')

obj = Foo()  # 执行 __init__
obj()  # 执行 __call__

#__call__

⑥ __dict__ 查看类或对象中的所有成员

class Province:
    country = 'China'

    def __init__(self, name, count):
        self.name = name
        self.count = count

    def func(self, *args, **kwargs):
        print('func')

# 获取类的成员,即:静态字段、方法、
print(Province.__dict__)
# 输出:{'__init__': <function Province.__init__ at 0x0054D588>, '__dict__': <attribute '__dict__' of 'Province' objects>,
#  '__doc__': None, 'func': <function Province.func at 0x0054D4B0>, '__weakref__': <attribute '__weakref__' of 'Province' objects>,
#  'country': 'China', '__module__': '__main__'}

obj1 = Province('HeBei', 10000)
print(obj1.__dict__)
# 获取 对象obj1 的成员
# 输出:{'count': 10000, 'name': 'HeBei'}

 __str__  如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值

#__str__

class Foo:
    def __str__(self):
        return 'lianzhilei'

obj = Foo()
print(obj)              #输出__str__返回值 而不是内存地址

# 输出:lianzhilei

⑧ __getitem__、__setitem__、__delitem__

  用于索引操作,如字典。以上分别表示获取、设置、删除数据

#__getitem__、__setitem__、__delitem__

class Foo(object):
    def __getitem__(self, key):
        print('__getitem__', key)

    def __setitem__(self, key, value):
        print('__setitem__', key, value)

    def __delitem__(self, key):
        print('__delitem__', key)

obj = Foo()

result = obj['k1']  # 自动触发执行 __getitem__
obj['k2'] = 'lzl'  # 自动触发执行 __setitem__
del obj['k1']

# __getitem__ k1
# __setitem__ k2 lzl
# __delitem__ k1

⑨ __new__ \ __metaclass__

上述代码中,obj 是通过 Foo 类实例化的对象,其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象;如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法创建

print type(f) # 输出:<class '__main__.Foo'>     表示,obj 对象由Foo类创建
print type(Foo) # 输出:<type 'type'>              表示,Foo类对象由 type 类创建

所以,f对象是Foo类的一个实例,Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建,那么类还有一种创建方式

def func(self):
    print("hello %s"%self.name)

def __init__(self,name,age):
    self.name = name
    self.age = age
Foo = type('Foo',(object,),{'func':func,'__init__':__init__})

f = Foo("jack",22)
f.func()

加上构造方法

类 是由 type 类实例化产生那么问题来了,类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象?

答:类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

class MyType(type):

    def __init__(self, what, bases=None, dict=None):
        print("--MyType init---")
        super(MyType, self).__init__(what, bases, dict)

    def __call__(self, *args, **kwargs):
        print("--MyType call---")
        obj = self.__new__(self, *args, **kwargs)

        self.__init__(obj, *args, **kwargs)

class Foo(object):

    __metaclass__ = MyType

    def __init__(self, name):
        self.name = name
        print("Foo ---init__")

    def __new__(cls, *args, **kwargs):
        print("Foo --new--")
        return object.__new__(cls)

# 第一阶段:解释器从上到下执行代码创建Foo类
# 第二阶段:通过Foo类创建obj对象
obj = Foo("lzl")

五.反射

通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法

① hasattr(obj,str) 判断一个对象obj里是否有对应的str字符串的方法

② getattr(obj,str) 根据字符串去获取obj对象里的对应的方法的内存地址

#hasattr、getattr

class Foo(object):
    def __init__(self,name):
        self.name = name

    def func(self):
        print("func",self.name)

obj = Foo("alex")
str = "func"

print(hasattr(obj,str))   # 检查是否含有成员 有没有obj.str属性

if hasattr(obj,str):
   getattr(obj,str)()      #getattr(obj,str) = obj.str

# True
# func alex

③ setattr(obj,'y','z')  obj.y = z

#setattr

def bulk(self):
    print("%s is yelling"%self.name)

class Foo(object):
    def __init__(self,name):
        self.name = name

    def func(self):
        print("func",self.name)

obj = Foo("alex")
str = "talk"

print(hasattr(obj,str))   # 检查是否含有成员 有没有obj.str属性

if hasattr(obj,str):
   getattr(obj,str)()      # getattr(obj,str) = obj.str

else:
    setattr(obj,str,bulk)   # setattr(obj,str,bulk 相当于 obj.str = bulk
    getattr(obj,str)()

# False
# alex is yelling

④ delattr(obj,str) 删除obj.str

#delattr

class Foo(object):
    def __init__(self,name):
        self.name = name

    def func(self):
        print("func",self.name)

obj = Foo("alex")
str = "name"

if hasattr(obj,str):
   delattr(obj,str)      # 删除属性obj.str

print(obj.name)

# Traceback (most recent call last):
#   File "C:/Users/L/PycharmProjects/s14/preview/Day7/main.py", line 40, in <module>
#     print(obj.name)
# AttributeError: 'Foo' object has no attribute 'name'

六.python异常处理

1.基础异常

在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!!

#异常处理

list = ["hello","world"]
try:
    list[3]
except IndexError as e:
    print("IndexError",e)

# IndexError list index out of range

上面程序表示try里面的代码如果出现IndexError这种错误,则执行except下面的代码,不会把错误信息显示给用户,程序也不会停止;目前只能处理IndexError这一种异常,想处理多种异常还可以这么写:

#多种异常处理

list = ["hello","world"]
try:
    list[3]
except IndexError as e:
    print("IndexError",e)

except KeyError as e:
    print("KeyError", e)

except ValueError as e:
    print("ValueError",e)

# IndexError list index out of range

万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任意异常

#万能异常处理

list = ["hello","world"]
try:
    list[3]
except Exception as e:
    print("Error",e)

#Error list index out of range
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

常用异常

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

跟多异常

2、异常的其他结构

#异常的其他结构

try:
    # 主代码块
    pass
except KeyError as e:
    # 异常时,执行该块
    pass
else:
    # 主代码块执行完,执行该块
    pass
finally:
    # 无论异常与否,最终执行该块
    pass

3、自定义异常

  主动触发异常

#主动触发异常

try:
    raise Exception('错误了。。。')
except Exception as e:
    print(e)

#错误了。。。

自定义异常

#自定义异常

class Diyexception(Exception):
    def __init__(self, msg):
        self.message = msg

    def __str__(self):
        return self.message

error = Diyexception("报错了....")

try:
    raise error

except Diyexception as e:
    print(e)

#报错了....

七.scoket

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

socket和file的区别:

  • file模块是针对某个指定文件进行【打开】【读写】【关闭】
  • socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

1、信息交互的程序

#server端

import socket

ip_port = ("127.0.0.1",9999)    #服务器端ip和服务端口
server = socket.socket()            #创建server
#server = <socket.socket fd=344, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>

server.bind(ip_port)                #绑定地址ip
#server = <socket.socket fd=344, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999)>
server.listen(5)                    #开始监听,允许5个客户端排队
conn,addr = server.accept()         #等待连接
#conn = <socket.socket fd=340, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999),
#  raddr=('127.0.0.1', 60086)>
#addr = ('127.0.0.1', 60086)

client_data = conn.recv(1024)       #收取信息,1024字节
#client_data = b'hello'
conn.sendall(client_data.upper())           #发送数据

conn.close()                        #关闭程序

客户端

#client端

import socket

ip_port = ("127.0.0.1",9999)        #要连接的服务器IP和端口
client = socket.socket()             #创建client

client.connect(ip_port)              #连接服务器端
info = "hello"

client.sendall(info.encode("utf-8"))   #发送数据包,把str转换为bytes类型
server_data = client.recv(1024)         #收取数据包

print(server_data.decode("utf-8"))

注:如果客户端发送空字符给服务端,客户端发送没有问题,但是服务器是不会接受空字符的,服务器依然会停留在接受状态,程序会一直卡着

2、功能介绍

 server = socket.socket()

参数一:地址簇

  socket.AF_INET IPv4(默认)
  socket.AF_INET6 IPv6

  socket.AF_UNIX 只能够用于单一的Unix系统进程间通信

参数二:类型

  socket.SOCK_STREAM  流式socket , for TCP (默认)
  socket.SOCK_DGRAM   数据报式socket , for UDP

  socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
  socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
  socket.SOCK_SEQPACKET 可靠的连续数据包服务

参数三:协议

  0  (默认)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,自动选择一个合适的协议

详情

# 服务端
import socket
ip_port = ('127.0.0.1',9999)
sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
sk.bind(ip_port)

while True:
    data,(host,port) = sk.recvfrom(1024)
    print(data,host,port)
    sk.sendto(bytes('ok', encoding='utf-8'), (host,port))

#客户端
import socket
ip_port = ('127.0.0.1',9999)

sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
while True:
    inp = input('数据:').strip()
    if inp == 'exit':
        break
    sk.sendto(bytes(inp, encoding='utf-8'),ip_port)
    data = sk.recvfrom(1024)
    print(data)

sk.close()

UDP Demo

② server.bind(address)

  server.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址

③ server.listen(backlog)

  开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5,这个值不能无限大,因为要在内核中维护连接队列

④ server.setblocking(bool)

  是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错

⑤ conn,addr = server.accept()

  接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。接收TCP 客户的连接(阻塞式)等待连接的到来

 client.connect(address)

  连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

⑦ client.connect_ex(address)

  同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061

⑧ client.close()

  关闭套接字

⑨ client.recv(bufsize[,flag])

  接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略

⑩ client.recvfrom(bufsize[.flag])

  与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址

⑪ server.send(string[,flag])

  将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送

⑫ server.sendall(string[,flag])  

  将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常;

内部通过递归调用send,将所有内容发送出去

⑬ server.sendto(string[,flag],address)

  将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议

⑭ sk.settimeout(timeout)

  设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )

⑮ sk.getpeername()

  返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)

⑯ sk.getsockname()

  返回套接字自己的地址。通常是一个元组(ipaddr,port)

⑰ sk.fileno()

  套接字的文件描述符

Python第八天的更多相关文章

  1. Python第八天 模块 包 全局变量和内置变量__name__ Python path

    Python第八天  模块   包   全局变量和内置变量__name__    Python path 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Pyt ...

  2. 孤荷凌寒自学python第八天 初识Python的序列之元组

    孤荷凌寒自学python第八天 Python的序列之元组 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) (同步音频笔记:https://www.ximalaya.com/keji/19103 ...

  3. Python第八天——Json

    json 模块 json 模块提供了非常完善的 Python 对象到 JSON 格式的转换 import json d = dict(name='Bob',age=20,score=88) json. ...

  4. Python 第八天

    文章读写 读写文章是最常见的 IO 操作. 读 1.Python 中内置了open()函数,read()方法以及close()方法来打开文件 fi = open('test.html','r') co ...

  5. python第八天)——购物车作业优化完成

    发现之前的三级菜单代码有BUG现已经修改过来了 购物车程序:启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够, ...

  6. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

  7. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  8. Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块

    Python第十三天   django 1.6   导入模板   定义数据模型   访问数据库   GET和POST方法    SimpleCMDB项目   urllib模块   urllib2模块 ...

  9. Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块

    Python第十一天    异常处理  glob模块和shlex模块    打开外部程序和subprocess模块  subprocess类  Pipe管道  operator模块   sorted函 ...

随机推荐

  1. H3C汇聚层交换机认证在线人数展示系统之CheckList和燃尽图(16/04/06-16/04/13)

    一.CheckList(核查表) 序号 事件 计划完成时间 实际完成时间 未延迟 未完成 完成 1 登录口令加密以及解密 16/04/06   16/04/06 Y     2 表的创建和IP以及口令 ...

  2. Cocos2dx对精灵的优化

    cocos2dx针对游戏设计的不同方面会有不同的优化方案,可以对声音,对内存,对图片格式,对色彩等等进行优化.有关这些方面的方法请大家查找其他的文章.我今天要说的是如何对精灵进行优化,程序中我们用到的 ...

  3. 鼠标焦点变化引起mouseout事件

    做了个小手术,渐渐回归网络啦! 问题: 在自制的提示离鼠标太近时,会引起无法提示的功能. 自制提示离图片太近时,提示图片一直一闪一闪的,截图截不出来,就只放改善后的图片(不闪). 原因: 为什么呢?书 ...

  4. JSTL的fn函数

    JSTL使用表达式来简化页面的代码,这对一些标准的方法,例如bean的getter/setter方法,请求参数或者context以及session中的数据的访问非常方便,但是我们在实际应用中经常需要在 ...

  5. grafana+graphit安装笔记

    OS:MAC 10.11查看测试线运行demo请访问http://10.103.13.101:3000/dashboard/db/graphite-carbon-metrics?editorTab=O ...

  6. ajax请求cookie有效性问题验证

    与人讨论时遇到一个问题,就是: 浏览器中后台发起的一个异步ajax请求,服务器做响应时,附带了cookie信息,那么后续对同域名下其他页面请求时,该cookie是否有效,会一并随请求提交到web服务器 ...

  7. 用bugzilla统计BUG

    bugzilla—— reports—— Tabular reports—— 选择版本号啥的跟search一样 上面的行标Vertical Axis选Resolution:列标Horizontal A ...

  8. sql指定插入自增长id的数据

    SET IDENTITY_Insert [Tag.V2].[dbo].[Members_EnAccount] ON; insert into [Tag.V2].[dbo].[Members_EnAcc ...

  9. ActiveMQ的初夜

    Producer Flow Control mq自己实现了Flow Control(流量控制,默认开启),在mq的版本中,4.x和5.x流量控制实现原理并不相同,前者通过 TCP Flow Contr ...

  10. 【引】runtime全解析,P1:Programming Guide

    h2.Overview Objective-C language defers as many decisions as it can from compile time and link time ...