面向对象和json
01. 属性
-
定义类就是用代码描述清楚这个类是拥有哪些相同功能和哪些相同属性的对象的集合,方法(函数)用来描述相同功能,属性(变量)用来描述相同属性。
-
属性分为两种:类属性、对象属性
-
类属性
-
怎么定义:直接定义在类中的变量就是类属性
class Student: a = 10 # a就是类属性
-
怎么使用:通过’ 类 . '的方式使用
class Student: a = 10 # a就是类属性 print(Student.a)
-
什么时候用:如果属性值不会因为对象不同而不一样的时候
-
-
对象属性
-
怎么定义:以’ 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()
-
-
在子类中添加内容
-
添加类属性和方法
直接在子类中定义新的类属性和新的方法
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()
-
添加对象属性
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数据格式
-
要求:
- 一个json有且只有一个数据
- 唯一的这个数据必须是json支持的类型的数据
-
支持类型:
-
数字 - 数字直接写,并且支持科学计数法,例如:23、-34、1.2131、3e5
-
字符串 - 只能使用双引号,支持转义字符,例如:’‘abc’’、“abc\n123”、"\u4e00"
-
布尔值 - 只有true和false两个值
-
空值 - null
-
数组 - 相当于Python的列表,[元素1,元素2,…]
-
字典 - 相当于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}'
-
作业
-
定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种 拥有方法:叫唤
人类拥有属性:姓名、年龄、狗 拥有方法:遛狗
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
-
定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积
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())
-
定义一个二维点类,拥有属性: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())
-
定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
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())
-
定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
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)