Day 14
面向对象
编程思路
1.面向过程编程(逻辑)
在遇到问题时,直接用算法或步骤解决问题
2.函数式编程(函数)
在遇到问题时,考虑现有函数能否解决问题,有则用,无则自定义
3.面向对象编程(类和对象)
在遇到问题时,考虑一个对象是否拥有解决这个问题的功能,有则用,无则自定义
类和对象
类就是拥有相同功能和相同属性的对象的集合(抽象的概念)
对象就是类的实例
两者相互对应,一个类可以有多个对象
-
定义类
语法:
class 类名: 类的说明文档 类的内容
说明:
- class
固定写法
- 类名
程序员自定义(1.必须是标识符2.不是关键字)用驼峰命名法且首字母大写
- 说明文档
类的说明注释
- 类的内容
包括方法(对象方法、类方法和静态方法)和属性(对象属性和类属性)
方法:
方法本质就是定义在类中的函数,用来对类的功能进行描述
属性:
属性就是在类中保存数据的变量,用来对类的属性进行描述
- class
class Person:
"""
"""
def sleep(self):
print('sleep')
def eat(self):
print('eat')
# 定义对象
'''
类名()
'''
p1 = Person()
p2 = Person()
print(p1, p2)
对象方法
对象方法就是直接定义在类中的函数
对象方法自带self参数,用对象调用方法时参数self不需要传参,系统会自动将当前对象传给self(谁调用就指向谁)
通过" 对象.方法名 "的形式来调用
class Dog:
def eat(self, food='bloon'):
print(f'self:{self}')
print(f'eat {food}')
# 创建一个Dog类的对象,保存在d1中
d1 = Dog()
print(f'd1:{d1}')
# 通过对象条用对象方法
d1.eat()
d1.eat('shit')
构造方法和init方法
-
构造函数(方法)
函数名和类同名,专门用来创建对象的函数就是构造函数(方法)
class Person: pass # Person()就是一个函数但是我们并没有定义这个函数,系统在我们定义类时已经帮我们自动创建了一个同名函数 p = Person() ''':伪代码(Python中调用构造函数创建对象的时候完成的操作) def Person(*args, **kwargs): 对象 = 创建对象 - 1.调用__new__函数创建对象 对象.__init__(*args, **kwargs) - 2.调用__init__方法,对对象进行初始化 return 对象 - 3.返回初始化完成后的对象 '''
-
init方法
魔法方法:类中用__开头和__结尾的方法
init方法会被系统在特定情况下自动调用(不需要程序员手动调用)
__init__:每次通过类创建对象的时候,系统都会自动调用这个方法
创建对象的时候构造函数的参数数量与init方法出self以外的参数数量对应
如果需要给类添加init方法只需要保证__init__为方法名,方法的性质位对象方法
class PersonPro: def __init__(self, *args, **kwargs): print('init方法被调用') p1 = PersonPro() p2 = PersonPro()
属性
-
类属性(类的字段)
- 定义:直接定义在类中但在函数外的变量
- 使用:通过" 类.属性名(变量名)"的形式来调用
- 应用场景:属性值不会因为对象不同而改变的属性使用类属性
-
对象属性
- 定义:以" self.属性名 = 值"的形式定义在__init__方法中
- 使用:以" 对象.属性名 "的形式来调用
- 应用场景:属性会因为对象不同而改变的属性使用对象属性
class Person: # num是一个类属性 num = 100 def func1(self): print('此函数被调用') # _不是类属性 _ = 100 # 类属性的调用 print(Person.num) # a是一个类属性 a = 'abc' # name和age就是对象属性 def __init__(self, name, gender='不明'): print('init函数被调用') self.name = name self.age = '默认值' self.gender = gender # 类属性的调用 print(Person.a, Person.num) # 对象属性的调用 p = Person('xiaoming') # 创建对象 print(p.name, p.age, p.gender) p.gender = 'male' print(p.gender)
# 练习:定义一个点类,属性:x坐标、y坐标,方法:打印当前点的信息(x,y) # 要求:创建点对象的时候可以给坐标赋值,不赋值时坐标为(0,0) # 添加方法:获取当前点到另外一个点的距离 import math class Point: def __init__(self, x=0, y=0): self.x = x self.y = y def stamp(self): print(f'点的坐标为:({self.x},{self.y})') def step(self, other): distance = math.hypot(self.x-other.x, self.y-other.y) print('两点之间的距离为:', distance) dot1 = Point() dot1.stamp() dot2 = Point(10, 20) dot2.stamp() dot3 = Point(13, 16) dot3.step(dot2)