Python Day 23 xml模块 、面向对象

  阅读目录:

    xml模块

    面向对象

  ##xml模块

XML 全称  可扩展标记语言
<tag></tag>  双标签
<tag/> 单标签  没有文本 一般用于设计文档结构 例如换行等
<tr/> 表示换行


<tag style="color:red" age="18">12345</tag>
一个标签的完整组成 有三个部分
tag 是标签名称
12345 是文本内容 text
name = "jack" 是标签的属性


其他的规范
1.又开始就必须有结束
2.所有属性值必须包含在双引号里面
3.只能有一个根标签 (最外层只能有一个标签)
4.开始标签和结束标签的顺序是相反的  最先打开谁 就最后关闭谁  最后打开的最先关闭
文档声明可不写 主要是告诉浏览器 该怎么解析这个文件
xml模块是自带的 不需要安装

与json的区别
    xml 是一种可扩展的标记语言
    可以高度自定义文档的结构 数据类型 标签的含义等等
    所以扩展性远比JSON要强

    json更加适用于 前后台数据交换  优点 轻量级  跨平台 语法简洁
    xml更多用来作为配置文件 当然 python不太常用
    html就是一种xml
#解析xml得到一个tree对象后 查找标签的4种方式

1.iter()
    如果没有参数则查找所有标签 
    如果有参数则查找所有名字匹配的标签 
    查找范围 为全文 
    
2.find() 
    必须给参数 
    查找当前标签的子标签  返回第一个名字匹配的
    
3.findall()
    必须给参数 
    查找当前标签的子标签  返回所有名字匹配的 

4.直接遍历某个标签 
    返回的是这个标签的所有子标签 
#一、常用操作
import xml.etree.ElementTree as ET
# 打开一个文档 得到一个元素树(XML文档)
tree = ET.parse("test1.xml")
# 获取根标签
root = tree.getroot()

## 顶层标签
#print(root.tag)
# 遍历出root标签的所有子标签
# for tag in root:
#     print(tag)

# 遍历出文档中所有标签
# for tag in root.iter():
#     print(tag)

# 从root下查找第一个名字为country的子标签
# country = root.find("country")
# print(country)

# 从root下查找所有名字为country的子标签
# countrys = root.findall("country")
# print(countrys)

# 从root下查找所有名字为country的子孙标签
# for tag in  root.iter("country"):
#     print(tag)
# 遍历XML文档的第二层
for tag in root:
# 第二层节点的标签名称和标签属性
    print(tag.tag,tag.attrib)
    # 遍历XML文档的第三层
    for i in tag:
         # 第二层节点的标签名称和内容
        print(i.tag,i.attrib,i.text)
# 遍历XML中所有的year节点
# for tag in  root.iter("neighbor"):
    # 节点的标签名称和内容
#     print(tag.tag,tag.attrib,tag.text)

#二、获取某个标签的详细内容
import xml.etree.ElementTree as ET

tree = ET.parse("test1.xml")
root = tree.getroot()

# 找到所有的country标签
es = root.findall("country")
# 获取某个标签的 标签名 属性 以及文本
# for e in es:
#     print(e.tag) # 标签名称
#     print(e.attrib) # 标签的所有属性 返回一个字典
#     print(e.text) # 标签的文本内容

#获取所有国家的 邻居的名称
# for c in es:
#     print("%s的邻居如下:" % c.attrib.get("name"))
#     for n in c.findall("neighbor"):
#         print(n.attrib.get("name"))
#     print("更新时间:%s" % c.find("year").text)
#     print("===================================")


#三、修改标签的某个属性
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element
# tree = ET.parse("test.xml")
# root = tree.getroot()
# # 修改文本
# root.text = "这是跟标签的文本"
# # 修改属性 没有则添加 有则覆盖
# root.set("name","jack")
# # 修改标签名字
# root.tag = "data"
#
# tree.write("test2.xml",encoding="utf-8",xml_declaration=True)

# 把test1.xml 中所有year标签的text加1
# tree = ET.parse("test1.xml")
# root = tree.getroot()
# for e in root.iter("year"):
#     e.text = str(int(e.text) + 1)
#
#
# tree.write("test1.xml")

# 把test1.xml 中所有gdppc删除
# remove 函数 需要一个标签作为参数 即要被删除的标签   然后只能有父标签来删除子标签
# tree = ET.parse("test1.xml")
# root = tree.getroot()
#
# for c in root.iter("country"):
#     gdppc = c.find("gdppc")
#     if gdppc != None:
#         c.remove(gdppc)
#
# tree.write("test4.xml")

# 添加标签
tree = ET.parse("test1.xml")
root = tree.getroot() # type:Element
# 创建需要被添加的子标签
new_tag = Element("ThisIsNewTag")
new_tag.text = "123" # 设置文本
root.append(new_tag) # 添加到root下
tree.write("test5.xml") # 写入文件

#四、代码生成xml文档
import xml.etree.ElementTree as et

# 创建标签
tag = et.Element("data")
tag.text = "123"
tag.set("name","jack")

# 创建一个元素树 并把tag添加到上面
tree = et.ElementTree(tag)
tree.write("test6.xml")

   ##面向对象

#面向过程编程思想
    关注的点就是完成任务的过程
    第一步
    第二步
    一步一步按照固定顺序来完成任务
    是一种机械化的思维,就像一条流水线,指定流水线只能生产指定产品
    缺点:
        牵一发而动全身 扩展性非常低,可维护性差
    优点:
        将复杂的事情,简单化,并流程化
    应用场景:
        对扩展要求较低的程序
        系统内核,shell脚本,计算器啥的

#面向对象的程序设计:
    核心是对象二字
    是 一种编程思想,让你不需要关心具体实现细节,而是关注对象
    优点:
        扩展性高,复用性,维护性    
    缺点:
        编程的复杂度远高于面向过程
    应用场景:
    需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。

#什么是对象?
    对象是特征与技能的结合体
    在程序中:用变量来表示对象的特征,用函数表示对象的技能
    对象的另一种理解方式:
        变量的作用数存储数据,函数的作用数处理数据 
        对象是将数据与处理数据的函数绑定在一起
#什么是类?
    类就是类型,类别,种类; 是一系列对象中相似特征与技能的结合体
#对象和类的关系?
    在生活中 先有对象 再有类
    在代码中 必须现有类 才能产生对象   (因为你需要提前告诉计算机这个对象是什么样的有什么技能)

#如何定义一个类?
    以学生类Student为例,在Python中,定义类通过`class`关键字:
    class Student:
        pass

    class后面紧接着是类名,即Student,遵循python编码规范,类名通常是大写开头的单词,多个单词时使用驼峰命名法        

#如何创建一个对象?
    创建对象也称之为实例化,定义好`Student`类后,就可以根据`Student`类创建出`Student`的实例,创建实例通过类名加上()实现:
    stu1 = Student()
    变量名`stu1`指向一个`Student`类的实例,`0x10b11d588`是实例的内存地址,每个实例的地址都不相同,

    `Student`本身则是一个类`(class)`

#对象的属性操作
  对象是特征(属性)与行为(方法)的结合体

  `stu`这个对象目前不具备任属性和方法,要为其添加属性可以在创建对象后使用点语法`(变量名加 . ) `比如为`stu`对象添加name属性


  stu1.name = "Jerry"

  同样通过点语法来获取对象的属性值
  print(stu1.name)
  #输出 Jerry

  #属性的查找顺序
  可以将类中的内容都称之为属性,变量称为数据属性,函数就叫函数属性

  类中可以声明变量来表示数据属性,为`Student`类添加数据属性和函数属性

  class Student:
      school = "Tsinghua"  # 数据属性
  
      def say_hello(self):  # 函数属性
          print("hello i am a student")

      def __init__(self, name):  # 初始化函数
          self.name = name

  问题1:在类中声明的数据属性和创建对象后为增加的数据属性,有什么区别?

​      类中的数据属性是所有对象共享的

​      创建对象后为增加的数据属性,是这个对象特有的,去其他对象无关

  问题2:类中声明的数据属性和创建对象后为增加的数据属性,其访问属性是怎样的?

​      优先查找对象自己的名称空间,如果没有则在类中找,如果类中也没有则到父类中找,直到找到为止,如果父类中也没有则抛出异常

   !!!注意!!!

  此处父类可能也有父类,会一直沿着继承关系查找到最终的父类Object,该继承关系,后续会详细讨论!

  stu1 = Student("Jack")
  stu2 = Student("Rose")

  #1.类中的数据属性是所有对象共享的
  print(stu1.school)
  print(stu2.school)
  #输出 Tsinghua
  #输出 Tsinghua

  #2.类中的数据属性访问的是同一块内存
  print(id(stu1.school))
  print(id(stu2.school))
  #输出 4470412656
  #输出 4470412656

  #3.类的函数属性是绑定给对象使用的,bound method称为绑定方法,每个对象的绑定方法内存地址不一样
  print(stu1.say_hello)
  print(stu2.say_hello)
  #输出 <bound method Student.say_hello of <__main__.Student object at 0x10cc405f8>>
  #输出 <bound method Student.say_hello of <__main__.Student object at 0x10cc40630>>


  #4.优先访问对象自己的名称空间 
  # 修改stu1的学习属性为北京大学 会在自stu1的名称空间增加school属性
  stu1.school = "Beijing"
  print(stu1.__dict__)
  print(stu2.__dict__)
  #输出 {'name': 'Jack', 'school': 'Beijing'}
  #输出 {'name': 'Rose'}

  #4.1再次查看学校属性
  print(stu1.school)
  print(stu2.school)
  #输出 Beijing
  #输出 Tsinghua

   ##类和对象的名称空间是独立的

  

猜你喜欢

转载自www.cnblogs.com/liangzhenghong/p/10871627.html