day17-面向对象和json

本文介绍了面向对象编程中的属性、继承、多态,以及如何使用json进行数据交换。实例涵盖类属性、对象属性、类方法与对象方法的区别,以及如何在子类中扩展和使用。还演示了如何将Python对象转化为JSON并解析JSON数据。
摘要由CSDN通过智能技术生成

day 17 面向对象和json知识点

1、属性

​ 1、属性

​ 1)定义类就是用代码描述清楚这个类是拥有哪些相同功能和哪些相同属性的对象的集合

​ a.方法(函数)用来描述相同功能

​ b.属性(变量)用来描述相同属性

​ c.属性分为两种:类属性、对象属性

​ 2)类属性

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

​ b.怎么使用:通过 ‘类.’ 的方式去使用

​ c.什么时候用:如果属性值不会因为读写不同而不一样的时候就用类属性

​ 3)对象属性

​ a.怎么定义:以 ‘self.属性名 = 值’ 的方式定义在 _ init _方法中

​ b.怎么使用:通过 ‘对象.’ 的方式去使用

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

class Student:
    """学生"""
    # a是类属性
    a = 10

    # name和age是对象属性
    def __init__(self):
        self.name = '朴彩英'
        self.age = 25


print(Student.a)
Student.a = 200
print(Student.a)

stu = Student()
print(stu.name, stu.age)


class Circle:
    """圆"""
    pi = 3.1415926

    def __init__(self):
        self.radius = '半径'


print(Circle.pi)
cir = Circle()
print(cir.radius)

​ 2、对象属性默认值

​ 1)赋一个固定值:每次创建对象的时候不能重新赋值,只能在创建好对象以后修改属性值

​ 2)使用没有默认值的参数赋值

​ 3)使用有默认值的参数赋值

class Person:
    """人"""
    def __init__(self, name, age, gender='女'):
        self.name = name
        self.age = age
        self.gender = gender
        self.height = 170

    def __repr__(self):
        # return f'<name:{self.name}, age:{self.age}, gender:{self.gender}>'
        return str(self.__dict__)


p1 = Person('朴彩英', 25)
p2 = Person('小明', 18, '男')
p3 = Person('小花', 19)

# print(p1.name, p2.name, p3.name)
# print(p1.age, p2.age, p3.age)
# print(p1.gender, p2.gender, p3.gender)
print(p1)
print(p2)
print(p3)

​ 3、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):
        """周长"""
        # 将self当成对象来使用
        # self = R1 , self = R2
        return (self.length + self.width) * 2


R1 = Rectangle(10, 20)
R2 = Rectangle(10, 5)
print(R1.get_perimeter())
print(R2.get_perimeter())
print(R1.get_area())
print(R2.get_area())

​ 4、方法的选择

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

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

​ 3)静态方法:既不需要类,也不需要对象

2、继承

​ 1、继承:继承就是让子类直接拥有父类的所有属性和方法

​ a.子类:继承者

​ b.父类:被继承者

​ c.语法:

"""
class 类名(父类列表):
    类的说明文档
    类的内容
    
注意:如果定义类的时候没有写父类,那么这个类默认继承python的基类 - object
"""
class Person:
    """人类"""
    count = 61

    def __init__(self):
        self.name = '朴彩英'
        self.age = 25
        self.gender = '女'

    def eat(self):
        """吃饭"""
        print('吃饭')

    def sleep(self):
        """睡觉"""
        print('睡觉')


class Student(Person):
    """学生类"""
    pass


print(Student.count)

stu = Student()
print(stu.name, stu.age, stu.gender)
stu.eat()
stu.sleep()


class A:
    x = 10

    def __init__(self):
        self.y = 12

    @classmethod
    def func1(cls):
        print('func1')

    @staticmethod
    def func2():
        print('func2')

    def func3(self):
        print('func3')


class B(A):
    pass


print(B.x)

b1 = B()
print(b1.y)
b1.func1()
b1.func2()
b1.func3()

​ 2、在子类中添加内容

​ 1)添加类属性和方法:直接在子类中定义新的类属性和新的方法

​ 2)添加对象属性

class C:
    a = 10

    def func1(self):
        print('对象方法func1')

    def __init__(self):
        self.m = 100
        self.n = 200


class D(C):
    # 新增类属性
    x = 1
    y = 2

    def func2(self):
        print('朴彩英')

    def __init__(self):
        # 在这儿调用父类的__init__方法就可以继承父的对象属性
        super().__init__()  # 调用当前类的父类的__init__()
        self.t = 2


print(C.a)
d1 = D()
d1.func1()
d1.func2()
print(d1.t, d1.m, d1.n)


class Animal:
    """动物类"""
    def __init__(self, age, gender='雌'):
        self.age = age
        self.gender = gender


class Cat(Animal):
    def __init__(self, name, breed='金渐层', age=4, gender='雌'):
        super().__init__(age, gender)
        self.name = name
        self.breed = breed

    def __repr__(self):
        return str(self.__dict__)


cat1 = Cat('板栗')
cat2 = Cat('糖一', '布偶', 2)
print(cat1)
print(cat2)

​ 3、多继承可以继承所有父类的所有方法和属性,只能继承第一个父类的对象属性

3、 json 数据

​ 1、json 数据:json 是一种通用的数据格式,主要用于不同语言之间进行有效的数据沟通

​ 2、json 数据格式

​ 1)要求:

​ a.一个json有且只有一个数据

​ b.唯一的这个数据必须是json支持的类型的数据

​ 2)json支持的数据类型:

​ 数字 - 数字直接写,并且支持科学计数法:3e5

​ 字符串 - 只能使用双引号,支持转义字符:“abc”、"\u4e00"、’"\u9fa5"’

​ 布尔值 - 只有 true 和 false 两个值

​ 空值 - null

​ 数组 - 相当于python的列表,[元素1, 元素2,…]

​ 字典 - 相当于python的字典,json的键只能是字符串

​ 3、python数据和json数据的相互转换

​ json模块提供了python中所有和json操作相关的函数

​ 1)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, 30]

result = json.loads(open('files/汽车新闻.json',encoding='utf-8').read())
for x in result['newslist']:
    print(x['title'])

​ 2)python 转 json

"""
python           json
int、float        数字
str              字符串,单引号变双引号
bool              布尔True -> true;False -> false 
列表、元组           数组
dict                字典,键会编程双引号字符串
None                null

json.dump(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}

result = json.loads(open('files/yxlm.json', encoding='utf-8').read())
for x in result['hero']:
    print(x['title'], x['goldPrice'])

day 17 作业

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

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

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

    class Dog:
        """狗类"""
        def __init__(self, name, gender, breed):
            self.name = name
            self.gender = gender
            self.breed = breed
    
        def bark(self):
            """叫唤"""
            return '叫唤'
    
    
    class Person:
        """人类"""
    
        def __init__(self, name, age, dog):
            self.name = name
            self.age = age
            self.dog = dog
    
        def walk(self):
            """遛狗"""
            return '遛狗'
    
  2. 定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积

    class Rectangle:
        """矩形类"""
        def __init__(self, width, length):
            self.width = width
            self.length = length
    
        def perimeter(self):
            """周长"""
            return (self.width + self.length) * 2
    
        def area(self):
            """面积"""
            return self.width * self.length
    
    
    r1 = Rectangle(10, 20)
    print(r1.perimeter())           # 60
    print(r1.area())                # 200
    
  3. 定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离

    class TheTwoDimensionalPoint:
        """二维点类"""
    
        def __init__(self, x_coordinate, y_coordinate):
            # x坐标和 y坐标
            self.x_coordinate = x_coordinate
            self.y_coordinate = y_coordinate
    
        def distance(self, x1, y1):
            """距离"""
            return ((self.x_coordinate - x1) ** 2 + (self.y_coordinate - y1) ** 2) ** (1/2)
    
    
    t1 = TheTwoDimensionalPoint(1, 2)
    print(t1.distance(2, 3))            # 1.4142135623730951
    
  4. 定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切

    class Circle:
        """圆类"""
        pi = 3.1415926
    
        def __init__(self, radius, x_coordinate, y_coordinate):
            # 半径
            self.radius = radius
            # 圆心
            self.center = (x_coordinate, y_coordinate)
    
        def perimeter(self):
            """周长"""
            return 2 * Circle.pi * self.radius ** 2
    
        def area(self):
            """面积"""
            return Circle.pi * self.radius ** 2
    
        def circumscribe(self, radius2, x1, y1,):
            """是否外切"""
            # 两圆心之间的距离
            value1 = ((self.center[0] - x1) ** 2 + (self.center[-1] - y1) ** 2) ** (1/2)
            # 两圆半径之和
            value2 = self.radius + radius2
            if value1 == value2:
                # 外切
                return True
            else:
                # 没有外切
                return False
    
    
    cir1 = Circle(1, 2, 2)
    print(cir1.circumscribe(1, 2, 0))           # True
    print(cir1.circumscribe(1, 4, 5))           # False
    
  5. 定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度

    class Segment:
        """线段类"""
        def __init__(self, x1, y1, x2, y2):
            self.start = (x1, y1)
            self.end = (x2, y2)
    
        def length(self):
            """线段的长度"""
            return ((self.end[0] - self.start[0]) ** 2 + (self.end[-1]- self.start[-1]) ** 2) ** (1/2)
    
    
    seg1 = Segment(1, 2, 3, 4)
    print(seg1.length())
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值