day17-面向对象及作业
类和对象
1.什么是类,什么是对象
"""
类:就是拥有相同功能和相同属性的对象的集合 - 抽象的概念
对象:就是类的实例 - 具体表现
"""
2.定义类 - 用代码描述清楚这个类是拥有哪些相同和哪些相同属性的对象的集合
"""
1.语法:
class 类名:
类的说明文档
类的内容
2.说明
class - 关键字;固定写法
类名 - 程序员自己命名
要求:是标识符,不是关键字
规范:驼峰命名和首字母大写
见名知义
不能使用系统的函数名,类名和模块名
类的说明文档 - 本质就是使用三个双引号开头和结尾的注释
类的内容 - 主要包括方法(对象方法、类方法和静态方法)和属性(对象属性、类属性)
方法:本质就是定义在类中的函数,是用来对类的功能进行描述
属性:本质就是在类中保存数据的变量,是用来对类的属性进行描述
"""
"""定义类"""
class Person:
"""描述类的内容和使用说明"""
def eat(self):
print('eat:吃苹果')
"""定义对象"""
per = Person()
print(per) # <__main__.Person object at 0x008FFC70>
3.定义对象 - 类名()
对象方法
"""
方法就是定义在类中的函数
什么是对象方法
怎么定义:直接定义在类中的函数
怎么调用:通过 对象.方法名 的形式来调用
特点是什么:自带参数self;用对象调用方法的时候参数self不需要传参,系统会自动将当前对象传给self
谁调用方法self就指向谁
"""
class Dog:
def eat(self,food='骨头')
print(f'狗吃{food}')
# 定义一个Dog对象,保存在dog中
dog = Dog()
dog.eat()
# 狗吃骨头
构造方法和init方法
'''__init__方法'''
"""
魔法方法:类中用__开头和__结尾def方法就叫魔法方法,魔法方法不需要程序员条调用
系统会自动调用
__init__:
1.每次通过类创建对象的时候,系统都会自动调用这个方法;
2.创建对象的时候构造函数有没有参数看对应的__init__方法除了self以外有没有额外的参数有几个
3.如果需要给类添加init方法主要保证方法名是__init__,以及方法的性质是对象方法就可以了
"""
Class Person:
def __init__(self,name,age)
print('我是在创建对象的时候就被调用了 ')
per = Person('张三',18) # 我是在创建对象的时候就被调用了
属性
"""属性 - 本质就是用来保存数据的变量"""
"""
类中的属性分为:类属性和对象属性两种
1.类属性
类属性又叫字段
怎么定义:直接定义在类中函数外面的变量就是类属性
怎么使用:通过 类.属性 的形式来使用
什么时候使用:属性值不会因为对象不同而不一样,这样的属性可以定义成类属性
2.对象属性
怎么定义:以 self.属性名 = 值 的形式定义在__init__方法中
怎么使用:以对象名.属性名 的形式来使用
什么时候使用:属性的值会因为对象的值不同而不一样,这样的属性就可以定义成对象属性
"""
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
per = Person('张三',18)
print(per.age) # 18
per.age = 20
print(per.age) # 20
# 练习:定义一个点类,有属性x坐标,y坐标,方法:打印当前点的信息
# 要求:创建点对象的时候可以给坐标赋值,如果不赋值x y 都是0
# 添加方法:获取当前点到另外一个点的距离
class Point:
def __init__(self,x=0,y=0):
self.x = x
self.y = y
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 = Point(10,20)
p2 = Point(20)
p1.print_info()
# x:10,y:20
p1.distance(p2)
# 22.360679774997898
作业
-
定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积
class Rectangle: def __init__(self,length,width): self.length = length self.width = width def perimeter(self): result = self.length + self.width print(f'周长为:{result}') def area(self): result = self.length * self.width print(f'面积为:{result}') rec = Rectangle(20,10) rec.perimeter() # 周长为:30 rec.area() # 面积为:200
-
定义一个二维点类,拥有属性: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,20) p2 = Point(5,6) print(p1.distance(p2)) # 14.866068747318506
-
定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
class Circle: def __init__(self, radii, center=Point(0,0)): self.radii = radii self.center = center def perimeter(self): return f'当前圆的周长为:{2 * self.radii * math.pi:.2f}' def area(self): return f'当前圆的面积为:{ math.pi*self.radii**2:.2f}' def is_wq(self,other): return self.center.distance(other.center) == self.radii + other.radii c1 = Circle(5) c2 = Circle(3,Point(10,0)) print(c1.is_wq(c2)) # False
-
定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
class Segment: def __init__(self,start,end): self.start = start self.end = end def get_length(self): return self.start.distance(self.end) seg1 = Segment(Point(10,0),Point(0,20)) print(seg1.get_length())
-
定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种 拥有方法:叫唤
人类拥有属性:姓名、年龄、狗 拥有方法:遛狗
class Person: def __init__(self,name,age=18,dog=None): self.name = name self.age = age self.dog = dog def walk_the_dog(self): if self.dog: print(f'{self.name}牵着{self.dog.name}') else: print(f'{self.name},没有狗!') per1 = Person('小明') per1.dog = Dog('大黄') per1.walk_the_dog()