day17 面向对象和json

面向对象和json

01. 属性

  • 定义类就是用代码描述清楚这个类是拥有哪些相同功能和哪些相同属性的对象的集合,方法(函数)用来描述相同功能,属性(变量)用来描述相同属性。

  • 属性分为两种:类属性、对象属性

    1. 类属性

      • 怎么定义:直接定义在类中的变量就是类属性

        class Student:
            a = 10          # a就是类属性
        
      • 怎么使用:通过’ 类 . '的方式使用

        class Student:
            a = 10          # a就是类属性
        print(Student.a)
        
      • 什么时候用:如果属性值不会因为对象不同而不一样的时候

    2. 对象属性

      • 怎么定义:以’ self . 属性名 = 值’的方式定义在 __ init __方法中

        class Student:
           
            def __init__(self):
                self.name = '小梁'
                self.age = 40
        
        stu = Student()
        print(stu.name,stu.age)
        
      • 怎么使用:通过’ 对象 . '的方式来使用

      • 什么时候用:如果属性值会因为对象不同而不一样的时候

02. 对象属性默认值

  • 赋一个固定的值,每次创建类的对象的时候不能重新赋值,只能创建好之后修改属性值

    class Person:
        def __init__(self):
            self.name = 'abc'
            self.age = 12
    p1 = Person()
    p2 = Person()
    print(p1.name,p1.age,p2.name,p2.age)
    
  • 使用没有默认值的参数赋值

    class Person:
        def __init__(self,name,age = 20):
            self.name = name
            self.age = age
    p1 = Person('abc',18)
    p2 = Person('123')
    print(p1.name,p1.age,p2.name,p2.age)
    
  • 使用有默认值的参数赋值

  • 魔法方法

    class Person:
        def __init__(self,name,age = 20,gender = '男'):
            self.name = name
            self.age = age
            self.gender = gender
    
        def __repr__(self):
            return str(self.__dict__)
    p1 = Person('abc',18)
    p2 = Person('123')
    print(p1)           # {'name': 'abc', 'age': 18, 'gender': '男'}
    print(p2)           # {'name': '123', 'age': 20, 'gender': '男'}
    
  • self的使用

    • 在对象方法中,self是谁调用就指向谁,所以在对象中可以直接将self当成对象来使用。(这个类的对象能做的事情self都可以做)

      class Rectangle:
          def __init__(self , length , width):
              self . length = length
              self . width = width
      
          def get_area(self):
              return self . length * self . width
      
          def get_perimeter(self):
              return (self . length + self . width) * 2
      
      
      r1 = Rectangle(10,5)
      r2 = Rectangle(12,43)
      print(r1.get_area())
      print(r2.get_perimeter())
      
  • 方法的选择

    • 对象方法:如果实现函数的功能需要对象(需要对象的属性)就使用对象方法

    • 类方法:实现函数的功能不需要对象(需要对象的属性)的前提下,需要类就使用类方法

    • 静态方法:都不需要

03. 继承

  • 继承就是让子类直接拥有父类的属性和方法。

    • 子类:继承者
    • 父类(超类):被继承者
  • 语法:

    • class 类名(父类列表)

      ​ 类的说明文档

      ​ 类的内容

    • 注意:如果定义类的时候没有写父类,那么这个类默认继承Python的基类-object

      class Person:
          count = 30
          def __init__(self):
              self.name = 'abc'
              self.age = 12
              self.gender = '男'
          def eat(self):
              print('吃饭')
          def sleep(self):
              print('睡觉')
      class Student(Person):
          pass
      print(Student.count)
      stu = Student()
      print(stu.name,stu.gender,stu.age)
      stu.eat()
      stu.sleep()
      
  • 在子类中添加内容

    1. 添加类属性和方法

      直接在子类中定义新的类属性和新的方法

      class C:
          a = 10
      
          def func1(self):
              print('对象方法func1')
      
      class D(C):
          # 新增类属性(字段)
          x = 20
          y = 30
      
          # 新增方法
          def func2(self):
              print('对象方法2')
      
          @classmethod
          def func3(cls):
              print('类方法')
      
      print(D.a)
      print(D.x,D.y)
      d = D()
      d.func1()
      d.func2()
      d.func3()
      
    2. 添加对象属性

      class C:
          a = 10
      
          def func1(self):
              print('对象方法func1')
      
          def __init__(self):
              self.m = 100
              self.n = 200
      
      class D(C):
          # 新增类属性(字段)
          x = 20
          y = 30
      
          # 新增方法
          def func2(self):
              print('对象方法2')
      
          @classmethod
          def func3(cls):
              print('类方法')
      
          def __init__(self):
              # 在这调用父类的__inint__方法就可以继承父类的对象属性
              super().__init__() #调用当前父类的__init__()
              self.t = 500
      
      print(D.a)
      print(D.x,D.y)
      d = D()
      d.func1()
      d.func2()
      d.func3()
      print(d.m,d.n)
      print(d.t)
      
  • 多继承可以继承父类所有父类的所有的方法和类属性,只能继承第一个父类的对象属性。

    class A:
        def func1(self):
            print('func1')
    
    class B:
        def __init__(self):
            self.m = 10
            self.n = 20
    
    
    class C:                    # AttributeError: 'F' object has no attribute 'x'
        def __init__(self):
            self.x = 30
            self.y = 40
    
    
    
    class F(A,B,C):
        def func1(self):
            print('func1')
    
        def __init__(self):
            # 在这调用父类的__inint__方法就可以继承父类的对象属性
            super().__init__()  # 调用当前父类的__init__()
            self.t = 500
    
    
    f = F()
    f.func1()
    print(f.m)
    print(f.t)
    print(f.m,f.n,f.t)
    print(f.x)                  # AttributeError: 'F' object has no attribute 'x'
    

04. json数据

  • json是一种通用的数据格式,主要用于不同语言之间进行有效的数据够用。

  • json数据格式

    • 要求:

      1. 一个json有且只有一个数据
      2. 唯一的这个数据必须是json支持的类型的数据
    • 支持类型:

      1. 数字 - 数字直接写,并且支持科学计数法,例如:23、-34、1.2131、3e5

      2. 字符串 - 只能使用双引号,支持转义字符,例如:’‘abc’’、“abc\n123”、"\u4e00"

      3. 布尔值 - 只有true和false两个值

      4. 空值 - null

      5. 数组 - 相当于Python的列表,[元素1,元素2,…]

      6. 字典 - 相当于Python的字典,但是键只能是字符串

  • Python数据和json数据的相互转换:import json

    • json转Python

      """
      json        python
      数字         int、float
      字符串        str(双引号变单引号)
      布尔值        true -> True; false -> False
      空值         null -> None
      数组         list
      字典         dict
      
      json.loads(json格式字符串)    -   将json格式字符串对应的json数据转换成相应的python数据
      注:json格式字符串 - 指的是字符串内容是json的字符串
      """
      
      import json
      json.loads('"abc"')   # 'abc'
      json.loads('100')     # 100
      json.loads('[10, 20, 30]')  # [10, 20, 30]
      json.loads('{"a": 10, "10": 20}')       # {'a': 10, '10': 20}
      result = json.loads('[10, "abc", true, null]')
      print(result)       # [10, 'abc', True, None]
      
    • Python转json

      """
      python          json
      int、float       数字
      str              字符串,单引号会变成双引号
      bool             布尔, True -> true, False -> false
      列表、元组         数组
      dict             字典,键会变成双引号字符串
      None             null
      
      json.dumps(python数据)   -   将指定的Python数据转换成json格式字符串
      """
      
      json.dumps(100)    # '100'
      json.dumps(True)   # 'true'
      json.dumps(None)   # 'null'
      json.dumps({10: 20, 'name': '小明', 'b': True})       # '{"10": 20, "name": "小明", "b": true}'
      

作业

  1. 定义一个狗类和一个人类:

    狗拥有属性:姓名、性别和品种 拥有方法:叫唤

    人类拥有属性:姓名、年龄、狗 拥有方法:遛狗

    class Canoidea:
        def func1(self):
            print('叫唤')
    
        def __init__(self,name,gender,breed):
            self.name = name
            self.gender = gender
            self.breed = breed
    
    class Human:
        def func2(self):
            print('遛狗')
    
        def __init__(self,name1,age,dog):
            self.name1 = name1
            self.age = age
            self.dog = dog
    
  2. 定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积

    class Rect:
        def __init__(self, w, l):
            self.width = w
            self.length = l
            
        def get_area(self):      
            return self.width * self.length        
    
        def get_perimeter(self):
            return (self.width + self.length) * 2
            
    r1 = Rect(10,5)
    print(r1.get_area())
    print(r1.get_perimeter())
    
  3. 定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离

    class CoordinateAxis:
        def __init__(self,x,y,x1,y1):
            self.x = x
            self.y = y
            self.x1 = x1
            self.y1 = y1
    
        def get_distance(self):
            return ((self.x-self.x1)**2 + (self.y-self.y1)**2)**0.5
    c1 = CoordinateAxis(2,3,-2,-3)
    print(c1.get_distance())
    
  4. 定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切

    class Circle:
        def __init__(self,r = 0 ,x = 0 ,y = 0,r1 = 0,x1 = 0 ,y1 = 0 ):
            self.r = r
            self.x = x
            self.y = y
            self.r1 = r1
            self.x1 = x1
            self.y1 = y1
        def get_perimete(self):
            return  self.r * 2 *3.14
    
        def get_area(self):
            return  self.r ** 2 * 3.14
    
        def excircle(self):
             if ((self.x-self.x1)**2 + (self.y-self.y1)**2)**0.5 == (self.r + self.r1):
                 print('外切')
             else:
                 print('不外切')
    
    
    c1 = Circle(5)
    print(c1.get_perimete())
    print(c1.get_area())
    
    c2 = Circle(5,3,2,3,-2,1)
    print(c2.excircle())
    
  5. 定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度

    class CoordinateAxis:
        def __init__(self,x,y,x1,y1):
            self.x = x
            self.y = y
            self.x1 = x1
            self.y1 = y1
    
        def get_distance(self):
            return ((self.x-self.x1)**2 + (self.y-self.y1)**2)**0.5
    c1 = CoordinateAxis(2,3,-2,-3)
    print(c1.get_distance())
    
import json
# 英雄,名字,价格
result = json.loads(open('files\FeHelper-20220308165054.json',encoding='utf-8').read())
for x in (result['hero']):
    print(x['name'],x['title'],x['goldPrice'])

# 平均价
result = json.loads(open('files\FeHelper-20220308165054.json',encoding='utf-8').read())
r1 = 0
for x in result['hero']:
    r1 += int(x['goldPrice'])
r2 = len(result['hero'])
print(r1 / r2)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值