一、XML的使用
- 处理xml消息包比较好用的模块是xml.etree.ElementTree。
- Element执行xml的根节点。
- elem.find(path):查找根节点下面路径为path的子节点。
- elem.findall(path):同样的子节点可能有多个,这里会返回一个列表。
- elem.findtext(path):获取指定路径子节点的内容,这个我们会经常使用。
- elem.get(key);获取属性的值。
- 上面如果没用,则返回none
- elem.append:添加自节点。
- elem.tag:返回tag值,也就是name。
- elem.text:返回内容。
- elem.attrib:返回属性的字典。
- SubElement:生成一个节点,自动添加为父节点的子节点。
- tostring:转化为xml文本字符串。但是不包括xml头。如果编码方式为UTF-8或者GB2312,gb2312都会产生xml头;如果是utf-8,则不会产生xml头
- fromstring:从字符串转化为ElementTree对象。和XML同样的功能。
- elem.set();设置属性值
二、time的使用
- time.sleep()函数函数具有c下sleep函数功能,单位为秒,但是可以接受浮点数。这样可以表示毫秒。
- ti = datetime.datetime.now()可以显示当前的时间,包括当前的微秒也可以显示出来。两个的差值可以表示时间 的间隔:microsecondLong = timeLong.seconds * 1000000 + timeLong.microseconds。差值的成员是seconds和microseconds
三、OO的使用
1、如果不想让成员变量或者方法被外部使用(也就是private特性),可以以__双下划线开通。
2、属性不但可以定义在init中,也可以定义在任意的方法中通过self定义。不过最好在init中定义。
3、Python也可以实现抽象基类,也就是接口:
网络异常,图片无法展示
|
|
4、__str__属性可以将对象转换为字符串,也就是调用print(object)是会打印的字符串。
5、call(魔法方法)可以将对象作为函数来调用。给它一个入参就可以。:
def __call__(self, protoVer): return api.protoModules[protoVer].TimeTicks( (time.time()-self.birthday)*100 ) 复制代码
它的作用:比较常用的是作为回调,因为他可以保存状态信息。它和闭包类似,可能比闭包的可读性要好一点。
6、对象实例是否可以删除?
7、Python参考手册要好好看一下。
8、python的static方法使用的是装饰器语法:@staticmethod.
9、对类的调用还有一个方法:CALSS.method(object)。
10、子类中,如果想调用父类的方法,可以通过:
parent.method(self).
不过还有更好的方法:
super(child, self).foo()//注意:这里是根据子类的类型获取父类的方法。它的好处是不用明显给出基类的类型。
11、cls:类方法的第一个参数。通常表示类的类型,可以通过cls()来生成实例。
@classmethod def spawn(cls, *args, **kwargs): """Return a new :class:`Greenlet` object, scheduled to start. The arguments are passed to :meth:`Greenlet.__init__`. """ g = cls(*args, **kwargs) g.start() return g 复制代码
12、继承,如果子类定义了__init__函数,子类的init函数不会默认调用父类的init函数,需要手动调用:parent.init。这一点是和c++有区别的。如果子类没有定义__init__,则子类会调用父类的__init__。这里可以发现,其实,子类如果定义了init函数,是对父类的init的一个覆盖。
13、super注意:!!!它只能用在新式的类定义中。什么是新式的?原来只是基类定义时继承object!!!。
14、继承如何继承方法:只要继承一个类,就会继承这个类所有的方法,包括__init__,del。但是如果子类重写某方法,就会覆盖父类的方法,不会再调用父类的方法了。如果想调用父类的方法,可以通过super的方式调用。
15、继承如何继承属性:只要不覆盖父类__init__方法,或者调用了父类的__init__方法,就会继承父类__init__属性的方法。继承后也可以更改这些属性。
16、父类如何防止被继承:方法或者属性以__开头,则可以防止被继承。
17、根据我的经验,其实可以以一种本质的方式理解Python的继承:Python的类就是一些方法的集合,继承一个类就是继承这个类的所有的方法。如果在子类中定义一个方法,其实是更改了这个类的符号。而属性,则可以在所有的方法中定义,只要调用了定义属性的方法,调用父类,则是继承父类的属性,调用子类定义属性的方法,则是定义子类的方法。
18、property:
class c(object): def __init__(self): self._num = 1 @property def num(self): return self._num * 10 @num.setter def num(self, v): self._num = v @num.deleter def num(self): pass o = c() print(o.num) o.num = 20 print(o.num) 复制代码
19、这样的好处是,可以在操作属性时,不用显示为方法调用,更加可读。同时又可以统一入口。 :注意,它也必须继承object才可以。
19、 OO中的垃圾回收:Python的垃圾回收使用的是符号引用计数。那么,如果在一个函数中申请一个对象,然后返回它的一个属性或者方法,这个时候对象的符号引用已经去掉,对象是否会释放?
class child(parent): def __init__(self): self.i = 8888 def foo(self): print('-----------------------') def __del__(self): print('now in del child') super(child, self).__del__() 复制代码
第一种情况,返回的是属性
def refun():
o = child() return o.i I = refun() 复制代码
这个时候,对象o会马上释放。因为o.i其实就是一个对象的引用,和o没有关系
第二种情况,返回的是方法
def refun(): o = child() return o.foo foo = refun() 复制代码
这个时候,对象o要等到foo释放的时候再释放,因为foo中包含了o的引用(foo的入参self)
20、对于对象的属性,如果属性是可读写的,则第一步没有必要用@property修饰。可以直接使用。后面如果有需要,在进行修饰。这样既减少了工作,修改时,也不会对原有代码进行改动。
作者:zhulin1028
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。