2021-5-19面向对象
类和对象
"""
定义类用代码描述清楚你这个类是拥有哪些相同功能哪些相同属性的对象的集合.
功能 - 对应的是函数
属性 - 保存数据的变量(在类中叫属性)
语法:
class 类名:
类的说明文档
类的内容
说明:
class - 关键字,固定写法
类名 - 程序猿自己命名
要求:是标识符,不是关键字
规范:见名知义:驼峰式命名(单词之间采用首字母大写),首字母大写;不使用系统函数名.类名和模块
: - 固定写法
类的说明文档 - 本质就是多行注释
类的内容 - 包括属性和方法
属性分为:类属性(类的字段)和对象属性
方法分为:对象方法,类方法,和静态方法
注解:方法就是定义在类中的函数
"""
class Student:
"""
学生类
"""
pass
"""
语法:类()
"""
stu1 = Student()
stu2 = Student()
print(stu1,stu2)
对象方法
"""
怎么定义: 直接定义在类中的函数(定义函数前不用加装饰器)
怎么调用: 用对象来调用 - 对象.函数名()
特点:自带参数self,在调用的时候self不用传参,系统会自动将当前对象传给self(谁调用self指向谁)
"""
class Person:
"""
人类
"""
def sleep(self):
print('睡觉')
def eat(self,food):
print('吃饭')
p1 = Person()
p1.sleep()
p2 = Person()
p2.eat(100)
构造方法和初始化方法
"""
定义类的时候可以根据需求在类中添加对象方法: __init__,添加的时候要保证函数名是__init__,第一个参数是self.
除此以外我们可以随意添加参数和函数体
每次使用类创建对象的时候,系统会自动调用这个类中的__init__方法
调用构造方法创建对象的时候需不需要参数,需要几个参数看这个类的__init__方法除了self以外有没有额外的参数.
魔法方法:类中,方法名由__开头并且以__结尾的方法就是魔法方法,所有的魔法方法都是自动调用.
"""
class Dog:
def __init__(self):
print('__init__被调用')
dog1 = Dog()
dog2 = Dog()
class Cat:
def __init__(self,name,age):
print('猫:__init__被调用')
print(f'name:{name},age:{age}')
cat1 = Cat('咪咪',2)
cat2 = Cat(name='土豆',age=2)
def __init__(x,y):
print('自己的__init__被调用')
print(f'x:{x},y:{y}')
def Cat(*args,**kwargs):
__init__(*args,**kwargs)
属性
"""
1) 类属性
怎么定义:直接定义在类中的变量就是类属性
怎么使用: 通过类来使用,类.类属性
什么时候用:属性的值不会因为对象不同而不一样,这种属性就定义成类属性
2) 对象属性
怎么定义:以'self.属性名=值'的形式定义在__init__方法中
怎么使用:通过对象来使用,对象.对象属性
什么时候用:属性的值会因为对象不同而不一样,这种属性就定义成对象属性
"""
class Person:
num = 61
def __init__(self):
self.name = '小明'
self.age = 18
self.gender = '男'
p1 = Person()
print(p1.name,p1.age,p1.gender)
print(Person.num)
Person.num = 60
print(Person.num)
"""
方式1:赋一个固定的值
方式2:使用没有默认值的参数赋值
方式3:使用有默认值的参数赋值
"""
class Dog:
def __init__(self,name,color,breed='中华田园犬',gender='母'):
self.breed = breed
self.name = name
self.gender = gender
self.color = color
self.age = 1
def __repr__(self):
return f'<{str(self.__dict__)[1:-1]}>'
dog1 = Dog('财财','黄色')
print(f'dog1:{dog1}')
dog2 = Dog('小白','白色',gender='公')
print(f'dog2:{dog2}')
class commodity:
def __init__(self,place='温州',form='食品',expiration_date='1年'):
self.price = '5元'
self.name = '辣条'
self.place = place
self.form = form
self.produced_date = '2021-5-19'
self.expiration_date = expiration_date
def __repr__(self):
return f'<{str(self.__dict__)[1:-1]}>'
com1 = commodity()
print(f'dog2:{com1}')
方法
"""
1. 对象方法
怎么定义:直接在类中定义函数(函数前不加装饰器)
怎么调用:对象.对象方法()
特点:自带参数self,self不用传参,谁调用self就指向谁
什么时候用:如果实现函数的功能需要用到对象属性,一定是对象方法
2. 类方法
怎么定义:在定义函数前加装饰器@classmethod
怎么调用:类.类方法()
特点:自带参数cls,cls不用传参,系统将当前类传给cls (谁调用就指向谁)
什么时候用:实现函数的功能,在不需要对象属性的时候需要类就使用类方法
3.静态方法
怎么定义:在定义函数前加装饰器@staticmethod
怎么调用:类.静态方法()
特点:没有默认参数
什么时候用:实现函数的功能既不需要当前类的对象也不需要当前类,就使用静态方法
"""
class Test:
def func1(self):
print('对象方法')
@classmethod
def func2(cls):
print(f'cls:{cls}')
print('类方法')
@staticmethod
def func3():
print('静态方法')
t1 = Test()
t1.func1()
Test.func2()
print()
作业
- 定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种
拥有方法:叫唤
人类拥有属性:姓名、年龄、狗
拥有方法:遛狗
class Dog:
def method(self):
return '狗类拥有技能:叫唤'
def __init__(self,name,gender,breed):
self.name = name
self.gender = gender
self.breed = breed
def __repr__(self):
return f'<{str(self.__dict__)[1:-1]}>'
dog1 = Dog('小白','母','京犬')
print(f'dog1:{dog1}',dog1.method())
class Mankind:
def __init__(self,name,age,dog):
self.name = name
self.age = age
self.dog = dog
def __repr__(self):
return f'<{str(self.__dict__)[1:-1]}>'
def skill(self):
return '人类拥有技能:遛狗'
mankind1 = Mankind('瑶荣露',24,'斗犬')
print(f'mankind1:{mankind1}',mankind1.skill())
- 定义一个矩形类,拥有属性:长、宽
拥有方法:求周长、求面积
周长 = (长+宽) *2
面积 = 长 * 宽
class Rectangle:
def __init__(self,length,breadth):
self.length = length
self.breadth = breadth
def perimeter(self):
return (self.length + self.breadth) * 2
def area(self):
return self.length * self.breadth
r1 = Rectangle(3,4)
print(f'周长:{r1.perimeter()}')
print(f'面积:{r1.area()}')
- 定义一个二维点类,拥有属性:x坐标、y坐标
拥有方法:求当前点到另外一个点的距离
class TwoPoint:
def __init__(self, x1=1, y1=1):
self.x1 = x1
self.y1 = y1
def distance(self, x2=1, y2=1):
print(((self.x1-x2)**2+(self.y1-y2)**2)**0.5)
- 定义一个圆类,拥有属性:半径、圆心
拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
不懂公式 尽力了 百度 B站都试过了
- 定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
class Line:
def __init__(self, x1=1, y1=1, x2=1, y2=1):
self.x1 = x1
self.y1 = y1
self.x2 = x2
self.y2 = y2
def line_long(self):
l_l = ((self.x1-self.x2)**2+(self.y1-self.y2)**2)**0.5
print(l_l)