day17 - 面向对象1
1、类 - (人类)就是拥有相同功能和相同属性的对象的集合 - 抽象概念
2、对象 - 类的实例(彭于晏是对象)
3、定义类 - 用代码描述清楚这个类是拥有哪些相同功能和哪些相同属性的对象集合
语法:
class 类名: # 类名规范:驼峰式命名并且首字母大写
类的说明文档
类的内容
类的内容: 方法(对象方法,类方法,静态方法)和 属性(类属性,对象属性)
方法:本质就是定义在类中的函数,对类的功能进行描述
属性:类中保存数据的变量,对类的属性进行描述
4、定义对象 - 类名()- 一般用一个变量来保存 - 变量名 = 类名()
5、对象方法
对象方法是类的内容,是定义在类中的函数
怎么定义:直接定义在类中的函数
**怎么调用**:通过'对象.方法名'的形式来调用
特点:自带参数self,用对象调用方法的时候参数self不传参,系统会自动将当前对象传给self,(self就是对象,就是那个用来保存类名()的变量,就是变量)
重点self的理解:self指向当前'对象.方法名'调用的 对象,也是**变量 = 类名()**,就是这里的变量名
6、构造函数(方法)
含义:函数名和类同名,专门用来创建对象的函数就是构造函数(方法)
python在定义类的时候,系统会自动创建这个类对应的构造函数
python中调用构造函数创建对象的时候内部会完成3个操作:
a. 调用__new__方法创建对象
b. 用创建好的对象调用__init__方法,对对象进行初始化操作
c. 返回初始化完成后的对象
__init__方法:
1、魔法方法:类中方法名用两个下滑线开头,和两个下划线结尾的方法就叫魔法方法,魔法方法不需要程序员主动调用,系统会在特定情况下自动去调用
__init__
1、每次通过类创建对象的时候,系统都会自动调用这个方法
2、创建对象的时候构造函数有没有参数:有几个看对应的init方法除了self以外有没额外的参数,有几个,就几个参数
3、如果需要给类添加init方法主要保证方法名__init__,以及方法的性质是对象方法就可以了
7、属性
属性:本质就是用来保存数据的变量
类中的属性分为类属性和对象属性2种:
- 类属性 -类属性又叫类的字段
- 定义:直接在类里面函数外面的变量
- 使用:通过**‘类名.属性’**的形式来使用
- 使用场景:属性值不会因为对象不同而不一样,这样属性就可以定义为类属性
- 对象属性
- 定义:以**‘self.属性名=值’的形式定义在__init__方法**中
- 使用:以**‘对象.属性**’的形式来使用
- 使用场景:属性值会因为对象不同而不一样,这样属性就可以定义成对象属性
class Person:
num = 61 # num就是类属性
a = 'abc'
def __init__(self, n ,g='男'):
self.name = n # name 就是对象属性
self.age = 0 #age 就是对象属性
self.gender = g #gender 就是对象属性
#使用类属性
print(Person.num,Person.a) # 在外面使用类属性 #61 abc
#使用对象属性
p1 = Person('小路','女')
print(p1.name,p1.age,p1.gender)# 小路 0 女
练习:定义一个Point类,属性:x坐标、y坐标,方法:以 'x:?,y:?'的形式打印点的信息
要求:创建点对象的时候可以给坐标赋值,如果不赋值x坐标和y坐标都是0
添加方法:获取当前点到另外一个点的距离
class Point:
def __init__(self,x1=0,y1=0):
self.x = x1
self.y = y1
def print_info(self): # 直接创建方法,根据不同的对象,就可以打印不同的坐标点,直接使用方法,不用,在外面打印,每一次坐标不同都有写一次
print(f'x:{self.x},y:{self.y}')
def distance(self,other):
return ((self.x - other.x)**2 +(self.y-other.y)**2)**0.5 # 求两点间的距离
p1 = Piont(8,9)
print(f'x:{p1.x},y:{p1.y}') # 在外面打印的话,每次多要打印不同的点
p2 = Piont()
print(p2.distance(p1)) # self此时就是现在的p2对象,p2对象调用distance方法,传入默认self自己本身和P1坐标点,就可以求P2的坐标到p1的坐标之间的距离了