day17面向对象和json数据
定义类就是用代码描述清楚这个类是拥有哪些相同功能和哪些相同属性的对象的集合,属性(变量)用来描述相同属性。
一、面向对象的属性
属性分为两种
1.类属性
1)怎么定义:直接定义在类中的变量就是类属性
2)怎么使用:通过’ 类. ’ 的方式使用
3)什么时候用:如果属性值不会因为对象不同而不一样的时候
2.对象属性
1)怎么定义:以“self . 属性名 = 值“的方式定义在_——init——方法中
2)怎么使用:通过’ 对象. ’ 的方式使用
3)什么时候用:如果属性值会因为对象不同而不一样的时候
# 练习:定义一个圆类,用两个属性分别是半径和圆周率
class Circle:
pi = 3.14
def __init__(self, r):
self.radius = r
a = Circle(10)
print(a.radius)
3.对象属性默认值
1)赋一个固定的值:每次创建对象不能重新赋值,只能在创建好对象以后修改属性值
2)使用没有默认值的参数赋值
3)使用有默认值的参数赋值
class Person:
def __init__(self, name, age, gender='男'):
self.name = name
self.age = age
self.gender = gender
def __repr__(self):
return str(self.__dict__)
p1 = Person('hua', 18)
print(p1)
4.self的使用
在对象方法中,self是谁调用就指向谁,所有在对象方法中,可以直接将self当成对象来使用(这个类的对象能做的事情self都可以做)
# 练习:定义一个矩形类,有长和宽两个属性,有求面积和求周长两个方法
class Rectangle:
def __init__(self, long, wide):
self.long = long
self.wide = wide
def get_area(self):
return self.long*self.wide
def get_perimeter(self):
return (self.wide+self.long)*2
rectangle_area = Rectangle(2,3)
print(rectangle_area.get_area())
print(rectangle_area.get_perimeter())
5.方法的选择
对象方法:如果实现函数的功能需要对象(需要对象属性)就使用对象方法
类方法:在实现函数的功能不需要对象(或者对象属性)的前提下,需要类就使用类方法
静态方法:既不需要类,也不需要对象
二、继承
继承就是让子类直接拥有父类所有的属性和方法。
'''
子类 - 继承者
父类(超类) - 被继承者
语法:
class 类名(父类列表)
类的说明文档
类的内容
注意:如果定义类的时候没有写父类,那么这个类默认继承python的基类-object
'''
1.在子类中添加内容
'''
1)添加类属性和方法
直接在子类中定义新的类属性和新的方法
2)添加对象属性
'''
2.多继承者可以继承所有父类的所有的方法和类属性,只能继承第一个父类的对象属性
class C:
a = 10
def func1(self):
print('对象方法')
def __init__(self):
self.m = 100
self.n = 200
print(a)
class D(C):
x = 20
y = 30
def func2(self):
print('1')
def __init__(self):
# 在这里需要继承父类的类方法
super().__init__() # 调用当前父类的__init__()
self.t = 2
json数据
json是一种通用的数据格式,主要用于不同语言之间进行有效的数据沟通
1.json数据格式
'''
要求:一个json有且只有一个数据;唯一的这个数据必须是json支持的类型的数据
json支持的类型:
1.数字 - 数字直接写,支持科学计数法,例如:67、1.23、-1、1.5、3e5
2.字符串 - 只能使用双引号,支持转义字符,例如:"abc" 、“ab\n23"
3.布尔值 - 只有ture和false两个值
4.none - null
5.数组 - 相当于python的列表,[元素1、元素2、.....]
6.字典 - 相当于python的字典,但是键只能是字符串
'''
2.python数据和json数据的相互转换
json模块中提供了python中所有和json操作相关的函数
导入json模块
json.loads('"abc"')#"abc"
json.loads('100')#100
'''
1)json转python
json python
数字 int 、float
字符串 str(双引号变单引号)
布尔值 true - True;false - False
控制 null - None
数组 list
字典 dict
json.loads(json格式字符) - 将json格式字符串对应的json数据转换成相应的python数据
注: json格式字符串 - 指的是字符串内容是json字符串
'''
'''
2)python转json
python json
int/float 数字
str 字符串,单引号会变双引号
bool 布尔,True - ture,False - false
列表、元组 数组
dict 字典,键会变成双引号字符串
None null
json.dumps(python数据) - 将指定的python数据转换成json格式字符串
'''
-
定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种 拥有方法:叫唤
人类拥有属性:姓名、年龄、狗 拥有方法:遛狗
class Dog: def mech(self): print('汪汪') def __init__(self, name, gender, breed): self.name = name self.gender = gender self.breed = breed def __repr__(self): return str(self.__dict__) class Person: def mech1(self): print("遛狗") def __init__(self, name, age, dog): self.name = name self.age = age self.dog = dog def __repr__(self): return str(self.__dict__) dog1 = Dog('旺财', '雄', '哈巴狗') dog1.mech() print(dog1) p1 = Person('小明', 18, '哈巴狗') p1.mech1() print(p1)
-
定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积
class Rec: 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 rec1 = Rec(4, 5) print(rec1.get_area()) print(rec1.get_perimeter())
-
定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离
class Twodimensional: def __init__(self, x, y): self.x = x self.y = y def point_point(self): return (self.x**2+self.y**2)**0.5+(self.x**2+self.y**2)**0.5
-
定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
class Circle: pi = 3.14 def __init__(self, rad, center1, center2): self.rad = rad self.center1 = center1 self.center2 = center2 def circumference(self): return 2 * self.rad * Circle.pi def get_area(self): return Circle.pi * (self.rad ** 2) def is_excircle(self): if (self.center1**2 +self.center2**2)**0.5+(self.center1**2 +self.center2**2)**0.5 == self.rad +self.rad: return True else: return False
-
定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
class Line: def __init__(self, star, terminus): self.star = star self.terminus = terminus def line_length(self): return ((self.star**2 +self.star**2)**0.5)**2+((self.terminus**2+self.terminus**2)**0.5)**2