Python开发基础总结(四)XML+time+OO 一、X

「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

一、XML 的使用

  1. 处理xml消息包比较好用的模块是xml.etree.ElementTree。
  2. Element执行xml的根节点。
  3. elem.find(path):查找根节点下面路径为path的子节点。
  4. elem.findall(path):同样的子节点可能有多个,这里会返回一个列表。
  5. elem.findtext(path):获取指定路径子节点的内容,这个我们会经常使用。
  6. elem.get(key);获取属性的值。
  7. 上面如果没用,则返回none
  8. elem.append:添加自节点。
  9. elem.tag:返回tag值,也就是name。
  10. elem.text:返回内容。
  11. elem.attrib:返回属性的字典。
  12. SubElement:生成一个节点,自动添加为父节点的子节点。
  13. tostring:转化为xml文本字符串。但是不包括xml头。如果编码方式为UTF-8或者GB2312,gb2312都会产生xml头;如果是utf-8,则不会产生xml头
  14. fromstring:从字符串转化为ElementTree对象。和XML同样的功能。
  15. elem.set();设置属性值

二、time 的使用

  1. time.sleep()函数函数具有c下sleep函数功能,单位为秒,但是可以接受浮点数。这样可以表示毫秒。
  2. ti = datetime.datetime.now()可以显示当前的时间,包括当前的微秒也可以显示出来。两个的差值可以表示时间 的间隔:microsecondLong = timeLong.seconds * 1000000 + timeLong.microseconds。差值的成员是seconds和microseconds

三、OO 的使用

1、如果不想让成员变量或者方法被外部使用(也就是private特性),可以以__双下划线开通。

2、属性不但可以定义在init中,也可以定义在任意的方法中通过self定义。不过最好在init中定义。

3、Python也可以实现抽象基类,也就是接口:

注意:不可以对私有属性和方法执行@abstractmethod。否则会失败。因为,私有的无法被重写,所以,无法生成被实例化。

4、__str__属性可以将对象转换为字符串,也就是调用print(object)是会打印的字符串。

5、call(魔法方法)可以将对象作为函数来调用。给它一个入参就可以。:

1
2
3
4
5
6
7
lua复制代码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()来生成实例。

1
2
3
4
5
6
7
8
9
python复制代码  @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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ruby复制代码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的垃圾回收使用的是符号引用计数。那么,如果在一个函数中申请一个对象,然后返回它的一个属性或者方法,这个时候对象的符号引用已经去掉,对象是否会释放?

1
2
3
4
5
6
7
8
9
10
ruby复制代码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():

1
2
3
ini复制代码    o = child()
return o.i
I = refun()

这个时候,对象o会马上释放。因为o.i其实就是一个对象的引用,和o没有关系

第二种情况,返回的是方法

1
2
3
4
ini复制代码def refun():
o = child()
return o.foo
foo = refun()

这个时候,对象o要等到foo释放的时候再释放,因为foo中包含了o的引用(foo的入参self)

20、对于对象的属性,如果属性是可读写的,则第一步没有必要用@property修饰。可以直接使用。后面如果有需要,在进行修饰。这样既减少了工作,修改时,也不会对原有代码进行改动。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%