day 17 note 面向对象基础
01. 认识类和对象
- #### 1. 什么是类,什么是对象
(1). 类: 类就是拥有相同功能 和 相同属性的对象 的集合.(类是是抽象的)
(2). 对象: 类的实例就是对象 (对象是具体的)
从生活的角度来看:
如果人是类,余婷就是人的对象,骆昊是人的另外一个对象
如果车是类,自行车、汽车、公交车是车类的子类(分类), 具体的某一辆车才是对象
- #### 2. 定义类 - 通过代码来描述清楚你是拥有哪些相同属性和哪些相同功能的对象的集合
语法:
class 类名:
类的说明文档
类的内容(类的属性 和 类的方法)
说明:
class - 关键字;固定写法
类名 - 程序员自己命名;
要求:是标识符;不能是关键字
**规范:驼峰式命名+首字母大写; ****
见名知义: 不使用系统提供的模块名、类名、函数名…
类的说明文档 - 使用三个双引号引起来的注释, 主要是用来对类的功能进行说明.(可有可无)
类的内容 - 包括类的属性(类属性和对象属性)和类的方法(对象方法、类方法和静态方法)
# 定义一个类
class Circle:
"""
圆:属性有半径、圆周率;直径
方法:计算面积、计算周长
"""
pi = 3.1415926
def __init__(self):
self.r = 3
self.d = 6
def area(self):
print(Circle.pi*self.r**2)
def perimeter(self):
print(2*Circle.pi*self.r)
# 创建两个Student类的对象
s1 = Circle( )
s2 = Circle( )
print(s1 is s2) # False(地址不一样)
print(id(s1), id(s2)) # 打印地址
print(s1)
print(s2)
# 创建Circle类的对象
c1 = Circle( )
02. 构造方法和初始化方法
1. 什么是构造方法(函数)
名字和类同名,功能是创建对应的类的对象 的函数。
python在定义类的时候,系统会自动为这个类创建对应的构造方法
魔法方法:类中用开头并且用结尾的函数,统称为魔法方法. 这一类方法不需要程序员去调用,系统会在合适的时候自动调用
2.初始化方法:( init )
1) 当通过类创建对象的时候,系统会自动调用这个类中的 ( init ) 方法
2) 在类中添加 ( init ) 方法的时候,只要保证方法名和默认参数 self 不动以外,程序员可以根据情况随意添加参数和函数体
3) 调用构造方法创建对象的时候需不需要参数,需要几个参数看对应类中的 ( init ) 方法除了self以外有没有额外的形参,有几个
class Person:
def __init__(self):
print('init')
p1 = Person()
p2 = Person()
class Dog:
def __init__(self, name, age, gender='公狗'):
print('init:', name, age, gender)
d1 = Dog('大黄', 3)
d2 = Dog(name='小白', age=2)
d3 = Dog('旺财', age=4)
d4 = Dog('财财', 3, '母狗')
03. 类的属性
1. 类属性 ( 类的字段 )
定义: 直接定义在类里面函数外面的变量
特点: 不会因为对象不同而不一样
怎么用: 类名.类属性
2. 对象属性
定义: 在( init )函数中,以 ‘self.属性名=值’ 的形式来定义
特点: 会因为对象不同而不一样
怎么用:对象.对象属性
(1). 使用类属性 ( 类名.类属性 )
class Person:
a = 10
def __init__(self):
self.name = '张三'
self.age = 18
self.gender = '男'
print(Person.a)
Person.a = 100
print(Person.a)
(2). 使用对象属性 ( 对象.对象属性 )
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 # 每次创建狗的对象的时候可以不给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)
04. 对象方法
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)