3.8总结-面向对象和json
1.属性
定义类就是用代码描述清楚这个类是拥有哪些相同功能和哪些相同属性的对象的集合,方法(函数)用来描述相同的功能,
属性(变量)用来描述相同的属性
属性分为两种:类属性、对象属性
1)类属性
a.怎么定义:直接定义在类中的变量
b.怎么使用:通过’类.'的方式去使用
c.什么时候用:如果属性值不会因为对象不同而不一样的时候
2)对象属性
a.怎么定义: 以’self.属性名 = 值 '的方式定义在__init__方法中
b.怎么使用: 通过’对象.'的方式去使用
c.什么时候用:如果属性值会因为对象不同而不一样的时候
2.对象属性默认值
1)赋一个固定的值:每次创建对象的时候不能重新赋值,只能在创建好对象以后修改属性的值
2)使用没有默认值的参数赋值
3)使用有默认值的参数赋值
3.self的使用
在对象方法中,self是谁调用就指向谁,所以在对象中可以直接将self当成对象来使用。(这个类的对象能做的事情self都可以做)
4.方法的选择
对象方法:如果实现函数的功能需要对象(需要对象属性)就使用对象方法
类方法:实现函数的功能不需要对象(或者对象属性)的前提下,需要类就使用类方法
静态方法:既不需要类,也不需要对象
5.继承
继承就是让子类直接拥有父类的属性和方法
子类 - 继承者
父类(超类) - 被继承者
语法:
class 类名(父类列表):
类的说明文档
类的内容
注意:如果定义类的时候没有写父类,那么这个类默认继承python的基类-object
6.json数据格式
要求:1) 一个json有且只有一个数据; 2)唯一的这个数据必须是json支持的类型的数据
json支持的类型:
1.数字 - 数字直接写,并且支持科学计数法,例如:24、423、-423、3e5
2.字符串 - 只能使用双引号,支持转义字符,例如: “abc” “321” “\u4e00”
3.布尔值 - 只能true 和 false 两个值
4.空值 - null
5.数组 - 相当于python的列表, [元素1,元素2…]
6.字典 - 相当于python中的字典,但字典的键必须是字符串
7.python数据和json数据的相互转换
1)json转 python
数字 int、float
字符串 str(双引号变单引号)
布尔值 true -> True false -> False
空值 null -> None
数组 list
字典 dict
json.loads(json格式字符串) – 将json格式字符串对应的json数据转换成相应的python数据
注:json格式字符串 - 指的是字符串内容是json的字符串
2)python转json
json.dumps(python数据) – 将指定python数据转换成json格式字符串
作业
-
定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种 拥有方法:叫唤
人类拥有属性:姓名、年龄、狗 拥有方法:遛狗
class Dog: def __init__(self, name, gender, breed): self.name = name self.gender = gender self.breed = breed def cry(self): print('汪汪汪') class Person: def __init__(self, name, age, dog): self.name = name self.age = age self.dog = dog def walk_dog(self): print(f'{self.name}牵着品种为{d1.breed},性别为{d1.gender}的{d1.name}在公园里走') d1 = Dog('大黄', '公狗', '哈士奇') p1 = Person('尹星', 18, 'd1') p1.walk_dog()
-
定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积
class Rect(): def __init__(self, h, w): self.height = h self.wide = w def get_perimeter(self): return (self.height + self.wide) * 2 def get_area(self): return self.height * self.wide
-
定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离
class Point: def __init__(self, x, y): self.x = x self.y = y def length(self, other): return ((self.x-other.x)**2 + (self.y - other.y)**2) ** 0.5 p1 = Point(0, 0) p2 = Point(3, 4) print(p1.length(p2))
-
定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
class Circle: pi = 3.14 def __init__(self, r, x, y): self.r = r self.p = (x, y) def get_perimeter(self): return 2 * Circle.pi * self.r def get_area(self): return Circle.pi * self.r ** 2 def excircle(self,other): if ((self.p[0]-other.p[0])**2+(self.p[1]-other.p[1])**2)** 0.5 == self.r + other.r: return '外切' else: return '不是外切' c1 = Circle(2, 0, 0) c2 = Circle(3, 3, 4) print(c1.get_area()) print(c1.get_perimeter()) print(c2.get_perimeter()) print(c2.get_area()) print(c1.excircle(c2))
-
定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
class Line: def __init__(self, x1, y1, x2, y2): self.p1 = (x1, y1) self.p2 = (x2, y2) def length(self): return ((self.p1[0]-self.p2[0])**2 + (self.p1[1]-self.p2[1])**2) ** 0.5 l1 = Line(0, 0, 3, 4) print(l1.length())