文章目录
一、编程思想
1.1 面向过程
🏠自己想要一套房子,就去劈石砍树设计搭建
- 遇到问题想通过代码逻辑来解决
工具:逻辑、算法
1.2 函数式
🏠挖掘机在哪?吊车在哪?砖窑呢?
- 遇到问题想有没有函数能帮助解决这个问题
- 没有就去定义一个可以解决这类问题的函数
工具:函数
1.3 面向对象
🏠你好,请问你会造房子吗?
- 遇到问题想有没有哪些东西有解决这个问题的能力
- 概括这类东西应该具有什么特点
- 以便日后批量产出
工具:类、对象
二、认识类和对象
2.1 什么是类,什么是对象
类:
(抽象)
拥有相同功能和相同属性的对象的集合
对象:
(具体)
类的实例
-------------------------------------------------
如果人是类,男人女人是子类,具体到你,我他就是对象。
2.2 定义类
通过代码来描述清楚一个对象的集合拥有哪些相同的属性和功能
语法:
class 类名:
类的说明文档
类的内容(类的属性和类的方法)
其中:
class 关键字;固定写法;
类名 自定义;满足标识符要求;驼峰式命名单词首字母大写;见名知义;
: 固定写法;
说明文档 三个双引号引起来的注释;对类的功能进行说明;方便他人使用;class上面的#注释也会被当作说明文档;
类的内容 类的属性(类属性和对象属性);类的方法(对象方法、类方法和静态方法);
class Student:
"""
举个学生例子
属性:姓名;年龄;学号;专业
功能:学习;玩耍
"""
def __init__(self, name='不明', age=None, stu_id=None, major=None):
self.name = name
self.age = age
self.study_id = stu_id
self.major = major
def study(self):
print('good good study, day day up!')
def play(self):
print('召唤师峡谷约一波~')
class Circle:
"""
圆类
类属性:pi
对象属性:r
方法:面积、周长
"""
pi = 6.2951413
def __init__(self, r=1):
self.r = r
def area(self):
print(Circle.pi * self.r ** 2)
def perimeter(self):
print(2 * Circle.pi * self.r)
三、创建对象
语法:
类名()
# 创建两个Student类的对象
stu1 = Student()
stu2 = Student()
print(stu1 is stu2) # False
print(id(stu1), id(stu2)) # 2903050662088 2903050665544
print(stu1) # <__main__.Student object at 0x000001645D85B0C8>
# 创建两个Circle类的对象
c1 = Circle()
c2 = Circle()
四、构造方法和初始化方法
python的构造方法已经写好了,不自己写
系统会自动为这个类创建对应的构造方法
4.1 构造方法(函数)
- 名字和类同名
- 功能是创建对应的类的对象
def Something(*args, **kwargs):
新建对象 = 调用__new__创建一个对象
新建对象.__init__(*args, **kwargs)
return 新建对象
4.2 初始化方法 init
- 系统主动调用的方法
- 当通过类来创建对象时,会被调用
- 在类中添加__init__时,只要方法名和默认参数self不动
- 可以根据情况随意添加参数和修改函数体
- 调用构造方法创建对象时需要几个参数,就看对应的类中__init__函数输了self之外有多少个形参
魔法方法:
类中用__开头__结尾的函数,统称为魔法方法
这些方法不需要程序员自己去调用
系统会在合适的时机自己调用
# 初始化函数在类创建对象时会被主动调用
class Person:
def __init__(self):
print('init被自动调用了')
person1 = Person() # init被自动调用了
# 给初始化函数传参
class Dog:
def __init__(self, name, age):
print(f'name:{name}, age:{age}')
dog1 = Dog('大黄', 18) # name:大黄, age:18
五、类的属性
类中的属性分为:类属性(类的字段)和对象属性
class Planet:
"""
行星
"""
is_planet = True
whats_this = 'Dust of star.'
def __init__(self, name=None, mass=None):
self.name = name
self.mass = mass
def __repr__(self): # 打印当前类的对象时,这个函数的返回值作为打印结果
return f'<{str(self.__dict__)[1:-1]}>'
5.1 类属性
- 定义:类里面,函数外面的变量
- 特点:不会因为对象改变而改变
- 比如圆类的圆周率,不同的圆都有相同的圆周率
- 使用:类名.类属性
print(Planet.whats_this) # Dust of star.
Planet.whats_this = 'Rest of star.'
print(Planet.whats_this) # Rest of star.
5.2 对象属性
- 定义:在__init__函数中,以‘self.对象属性=值’ 的方式来定义
- 特点:可随对象改变而改变
- 比如人类的名字、年龄
- 使用:对象.对象属性
earth1 = Planet(name='earth', mass=6 * 10 ** 24)
print(earth1.name) # earth
print(earth1.mass, 'kg') # 6000000000000000000000000 kg
print(earth1.whats_this) # Rest of star.
earth1.whats_this = 'Rest of sun.'
print(earth1.whats_this) # Rest of sun.
print(Planet.whats_this) # Rest of star.
print(earth1) # <'name': 'earth', 'mass': 6000000000000000000000000, 'whats_this': 'Rest of sun.'>
六、对象方法
6.1 方法
- 定义在类中的函数就是方法
- 对象方法、类方法、静态方法
6.2 对象方法
怎么定义: 直接定义在类中的函数就是对象方法(定义函数前不加装饰器)
特点: 自带参数self;调用时系统自动把对象传进self
怎么调用: 通过 对象.方法名() 的形式调用
什么时候用: 实现函数功能需要用到对象属性的时候
class Tree:
def grow(self):
print(self)
print('taller,taller...')
6.3 证明系统把对象自动传给了self
tree1 = Tree()
tree1.grow() # <__main__.Tree object at 0x000001C53CA70488> taller,taller...
print(tree1) # <__main__.Tree object at 0x000001C53CA70488>
class Rectangle:
def __init__(self, width=1, height=1):
self.width = width
self.height = height
def area(self):
return self.width * self.height
square1 = Rectangle(10, 20)
square2 = Rectangle(30, 30)
square3 = Rectangle()
print(square1.area()) # 200
print(square2.area()) # 900
print(square3.area()) # 1
print(type(Rectangle)) # <class 'type'>
print(type(square1)) # <class '__main__.Rectangle'>
练习
# 练习:定义一个点累(二维),有属性:x坐标、y坐标;方法:点到指定点的距离
class Point:
def __init__(self, location=(0, 0)):
self.loc = location
self.x = location[0]
self.y = location[1]
def far_from(self, loc):
return ((self.x - loc[0])**2 + (self.y - loc[1])**2)**0.5
p1 = Point((1, 3))
p2 = Point((10, 4))
d = p1.far_from(p2.loc)
print(d)