day17-面向对象基础
1.面向对象编程
- 编程思想
1)面向过程编程(琼B) - 一遇到问题马上想到代码实现解决问题的逻辑来解决问题
工具:逻辑 算法
2)函数式编程(小资) - 一遇到问题马上想到有没有一个已经存在函数能够帮我解决问题,如果没有自己写一个函数
工具:函数
3)面向对象编程(土豪) - 一遇到问题马上想到有没有一个对象拥有解决这个问题的能力,如果没有就自己创造能够创造这个对象的类
工具:类,对象
2.认识类和对象
- 什么是类,什么是对象
类:类就是拥有相同功能和相同属性的对象的集合 (类是抽象的)
对象:类的实例就是对象
从生活的角度来看:
如果人是类,赵云就是人的对象,马超是人的另外一个对象
如果车是类,自行车、汽车、公交车是车类的子类(分类),具体的莫一辆车才是对象
- 定义类 - 通过代码来描述请你是拥有哪些相同属性和那些相同功能的对象的集合
语法:
class 类名:
类的说明文档
类的内容(类的属性和类呃方法)
说明:
class - 关键字;固定写法
类名 - 程序员自己命名;
要求:是标识符;不能是关键字
规范:驼峰式命名,首字母大写;见名知义;不使用系统提供的模块名、类名、函数名...
类的说明文档 - 使用三个双引号引起来的注释,主要是用来对类的功能进行说明。(可有可无)
类的内容 - 包括类的属性(类属性和对象属性)和类的方法(对象方法、类方法和静态方法)
- 创建对象
语法:
类名()
class Student:
"""
说明文档
"""
def __init__(self):
self.name = '小明'
self.age = 18
self.study_id = '000'
self.major = '计算机'
def study(self):
print('good good study, day day up!')
def play(self):
print('召唤师峡谷牛逼~')
class Circle:
"""
圆:属性有半径、圆周率;方法:计算面积、计算周长
"""
pi = 4.1315926
def __init__(self):
self.r = 0
def area(self):
print(Circle.pi*self.r**2)
def perimeter(self):
print(2*Circle.pi*self.r)
创建两个Student类的对象
s1 = Student()
s2 = Student()
print(s1 is s2)
print(id(s1), id(s2))
print(s1)
print(s2)
3.构造方法和初始化方法
- 什么是构造方法(函数)
名字和类同名,功能是创建对应的类的对象的函数。
python在定义类型的时候,系统会自动为这个类创建对应的构造方法
魔法方法:类中用__开头并且用两个__结尾的函数,统称为魔法方法。这一类方法不需要程序员去调用,系统会再合适的时候自动调用
- 初始化方法: __ init __
-
当通过类创建对象的时候,系统会自动调用这个类中的__init__方法
-
在类中添加__ init __方法的时候,只要保证方法名和默认参数self不懂以外,程序员可以随意添加参数和函数体
-
调用构造方法创建对象的时候需不需要参数,需要几个参数看对应类的__init__方法除了self以外有没有额外的形参,有几个就定义几个self
class Person:
def __init__(self):
print('init')
p1 = Person()
class Dog:
def __init__(self, name, age):
print(name, age)
d1 = Dog()
4.类的属性
类中的属性分为:类属性(类的字段)和对象属性
1.类属性
定义:直接定义在类里面函数外面的变量
特点:不会因为对象不同而不一样
怎么用:类名.类属性
2.对象属性
定义:定义在__init__函数中,以 ‘self.属性名=值’ 的形式来定义
特点:会因为对象不同而不一样
怎么用:对象.对象属性
class Person:
a = 10
def __init__(self):
self.name = '马超'
self.age = '18'
self.gender = '男'
# 使用类属性
print(Person.a)
Person.a = 100
print(Person.a)
# 使用对象属性
p1 = Person()
print(p1.name, p1.age, p1.gender)
p1.name = '小明'
print(p1.name, p1.age, p1.gender)
p2 = Person()
print(p2.name, p2.age, p2.gender)
class Dog:
def __init__(self, name, color, gender='母狗', breed='土狗'):
self.name = name # 每次创建狗的对象的时候必须给name属性传参
self.gender = gender
self.age = 1 # 每次创建狗的对象的时候age的值只能是1
self.color = color
self.breed = breed
# __repr__魔法方法:打印当前类的对象的时候,系统会自动调用这个方法,并且把这个方法的返回值作为打印结果(返回值必须是字符串)
def __repr__(self):
# self: 打印谁self就指向谁
# return str(self.__dict__)
return f'<{str(self.__dict__)[1:-1]}>'
d1 = Dog('大黄', '黄色')
print(d1.name, d1.color, d1.gender, d1.age, d1.breed)
d2 = Dog('小白', '白色', breed='哈士奇')
print(d2)
# str1 = "{'name': '小白', 'gender': '母狗', 'age': 1, 'color': '白色', 'breed': '哈士奇'}"
# new_str1 = f'<{str1[1:-1]}>'
# print(new_str1)
5.对象方法
1.方法
定义在类中的函数就是方法。类中的方法分为:对象方法、类方法、静态方法
2.对象方法
怎么定义:直接定义在类中的函数就是对象方法(定义函数前不加装饰器)
特点:自带参数self;调用的时候参数self不需要传参,系统会自动将当前对象传给self(谁调用self就指向谁)
怎么调用:通过 对象.方法名() 的形式来调用
什么时候用:如果实现函数的功能需要用到对象属性的时候
class Student:
def study(self):
# self=s1
print('self:', self)
print('学习')
def eat(self, food):
print('吃东西:', food)
def func1(self):
print('函数!')
# 通过对象调用对象方法
s1 = Student()
print('s1:', s1)
s1.study() # study(s1)
class Rectangle:
def __init__(self, width=100, height=100):
self.width = width
self.height = height
def area(self):
# self=r1; self=r2
return self.width * self.height
r1 = Rectangle(100, 20)
result = r1.area() # area(r1)
print(result)
r2 = Rectangle(50, 80)
result = r2.area() # area(r2)
print(result)
# 练习:定义一个点类(二维),有属性: x坐标、y坐标 方法:计算当前点到指定点的距离
class Point:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def distance(self, other):
return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5
p1 = Point(10, 10)
p2 = Point(30, 40)
result = p1.distance(p2) # distance(p1, p2)
print(result)