day3.08-面向对象和json
1. 属性
属性
'''
定义类就是用代码描述清楚这个类拥有那些相同功能和相同属性的集合,方法(函数)是用来描述相同功能
属性(变量)用来描述相同属性
属性分为两种:类属性、对象属性
1)类属性:
a. 怎么定义:直接定义在类中的变量就是类属性
b. 怎么使用:通过'类.'的方法去使用
c.什么时候用:如果属性值不会因为对象不同而不一样的时候
2)对象属性
a. 怎么定义:以'self.属性名 = 值'的方式定义在__init__方法中
b. 怎么使用:通过'对象.'的方式去使用
c.什么时候用:如果属性值会因为对象不同而不一样的时候
'''
import math
class Circle:
pi = math.pi
def __init__(self,radius):
self.radius =radius
# print(0)
print(Circle.pi)
a = Circle(3)
print(a)
对象属性默认值
'''
1)赋一个固定的值:每次创建对象的时候不能重新赋值,只能重新赋值,只能在创建好对象以后修改属性的值
2)使用没有默认值的参数赋值
3)使用有默认值的参数赋值
'''
self的应用
'''
self是谁调用就指向谁,所以在对象方法中可以直接将self当成对象用。(这个类的对象能做的事self都可以做)
'''
# 练习:定义一个矩形类,又长和宽两个属性,有求面积和周长两个方法
print('================')
class Rectangle:
def __init__(self,wide,long):
self.wide = wide
self.long = long
area = self.long * self.wide
perimeter = self.long * 2 + self.wide * 2
print(area,perimeter)
x = Rectangle(3,4)
方法的选择
'''
对象方法:如果实现函数的功能需要对象(需要对象属性)就用对象方法
类方法:在实现函数的功能不需要对象(或者对象属性)的前提下,需要类就是用类方法
静态方法:既不需要类也不需要对象
'''
2. 继承
继承
'''
继承让子类直接拥有父类的属性和方法
子类 - 继承者
父类(超类) - 被继承者
语法:
class 类名(父类列表):
类的说明文档
类的内容
注意:如果定义类的时候没有写父类,那么这个类默认继承python的基类-object
'''
class Person:
a1 = 100
def __init__(self):
self.name = '小明'
self.age = 18
self.gender = '男'
def __repr__(self):
return str(self.__dict__) # !!!!!!!!!!!!!
'''
def __repr__(self):
return str(self.__dict__)
将__init__()中的全部打印出来
'''
class Students(Person):
def __init__(self):
super().__init__() # 调用父类的__init__()
self.hight = 170
# a = Students()
# print(a.name)
# print(a)
在子类中添加内容
'''
1)添加类属性和方法
直接在类中定义新的类属性和新的方法
2)添加对象属性
super().__init__() - 调用父类中的__init__()函数
'''
多继承
# 3. 多继承可以继承所有父类1的方法和类属性,只能继承第一个父类的对象属性
class A:
pass
class B:
def __init__(self,hight,weight):
self.hight = hight
self.weight = weight
class C(A,B,Person):
def __init__(self,tel,weight=180,hight=170):
super().__init__(weight,hight)
self.tel = tel
a = C(110,hight=170,weight=180)
# print(a.name)
print(a)
print(a.weight)
print(a.tel)
3. json数据
json数据
'''
json是一种通用的数据格式,主要用于不同语言之间进行数据沟通
'''
json数据格式
'''
要求:1)一个json有且只有一个数据;2)唯一的数据必须是json支持的数据
json支持的类型:
1. 数字 - 数字直接写,并且支持科学记数法,例如:63,4.23,-22,22.3,3e5
2. 字符串 - 只能使用双引号,支持转义字符,例如:"aca","adad\nda"
3. 布尔值 - 只有true 和 false两个值
4. 空值 - null
5. 数组 - 相当于python的列表,[a,s,d,ad,daa,...]
6. 字典 - 相当于python的字典,json中的键只能是字符串
'''
python数据和json数据的相互转换
# json模块中提供了python中所有和json操作相关的函数
import 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的字符串
'''
result = json.loads(open('files/汽车新闻.json','r',encoding='utf-8').read())
for i in result:
print()
# 2)python转json
'''
python json
int、float 数字
str 字符串,单引号会变成双引号
bool 布尔,True -> true,False -> false
列表,元组 数组
dict 字典键会变成双引号字符串
None null
json.dump(python数据) - 将指定的python数据转换成json数据
作业
-
定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种 拥有方法:叫唤
人类拥有属性:姓名、年龄、狗 拥有方法:遛狗
class Dog: def __init__(self,name,gender,breed): self.name = name self.gender = gender self.breed = breed def func1(self): print('叫唤') def __repr__(self): return str(self.__dict__) class Person: def __init__(self,age,dog,name): self.name = name self.dog = dog self.age = age def func2(self): print('遛狗') def __repr__(self): return str(self.__dict__) a = Dog(3,'雄','法斗') b = Person(name='小明',age='18',dog='小黑') print(a) print(b) print(a.func1()) print(b.func2())
-
定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积
class Rect: def __init__(self, wide, long): self.wide = wide self.long = long area = self.long * self.wide perimeter = self.long * 2 + self.wide * 2 print(area, perimeter) x = Rect(3, 4)
-
定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离
class Two_dimension: def __init__(self,x1,y1,x2,y2): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 def func1(self): result = ((self.x1 - self.x2) ** 2 + (self.y1 - self.y2) ** 2) ** 0.5 print(result) a = Two_dimension(0,0,1,1) print(a.func1())
-
定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
import math class Circle: globals() pi = math.pi def __init__(self,r1,x1,y1,r2,x2,y2): self.r1 = r1 self.x1 = x1 self.y1 = y1 self.r2 = r2 self.x2 = x2 self.y2 = y2 def func3(self): result1 = Circle.pi * (self.r1 ** 2) result2 = 2 * Circle.pi * self.r1 print(f'面积:{result1}') print(f'周长:{result2}') def func4(self): distance = ((self.x1 - self.x2) ** 2 + (self.y1 - self.y2) ** 2) ** 0.5 if distance == ((self.r1 - self.r2) ** 2) ** 0.5: print('外切') else: print('不外切') a = Circle(3,0,0,5,6,4) print(a.func3()) print(a.func4())
-
定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
class Segment: def __init__(self,x,y): self.x = x self.y = y def func1(self): result = ((self.x - self.y) ** 2) ** 0.5 print(result) a = Segment(0,9) print(f'线段长度:{a.func1()}')
-
获取英雄名字和价格
import json result = json.loads(open('json数据/FeHelper-20220308165245.json',encoding='utf-8').read()) name_list = [] price_list = [] for i in result['hero']: name_list.append(i['name']) price_list.append(i['goldPrice']) # print('英雄名称',name_list) # print('英雄价格',price_list) hero_dict = {} for i in range(len(name_list)): hero_dict.setdefault(name_list[i],price_list[i]) print(hero_dict)