「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」
一、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修饰。可以直接使用。后面如果有需要,在进行修饰。这样既减少了工作,修改时,也不会对原有代码进行改动。