面向对象
一、编程思想,认识类、对象
1 什么是类、什么是对象
类 - 类是拥有相同功能和相同属性的对象的集合。(类是一个抽象的概念)
对象 - 对象是类的实例(是类的具体表现)
从生活的角度:如果人是类,单独个人就是对象
2 定义类(创建类) - 用代码来描述清楚这个类到底是拥有那些相同功能和相同属性的对象的集合
功能:- 函数
属性:- 属性(保存数据的变量)
语法:
class 类名:
类的说明文档
类的内容(包括类的属性和方法)
注解:方法 - 定义在类中的函数
属性 - 定义在类中的变量
说明:
class - 关键字;固定写法
类名 - 有程序员自己命名,必须符合名要求和规范
要求:是标识符;不能是关键字
规范:见名知义;采用驼峰式命名(由多个单词组成,单词间通过首字母大写来区分),第一个 字母大写
不使用系统的函数名、类名或者模块名
类的说明文档 - 本质就是多行注释
类的内容 - 由方法和属性组成
方法包括:对象方法、类方法和静态方法
属性包括:类属性(字段)和对象属性两种
3 创建对象
对象是类的实例,创建对象必须通过类来创建
语法:
对象=类名()
二 方法与属性
(1)方法
类中的方法分为三种:对象方法、类方法、静态方法
1对象方法
1)怎么定义:直接定义在类中的函数就是对象方法
2)怎么调用:通过对象来调用 — 对象.对象方法()
3)特点:用对象调用对象方法的时候,参数self不需要传参,系统会自动将当前对象传给self(谁去调用的这个方法当前对象就是谁)
2类方法
1)怎么定义:定义函数前加@classmethod
2)怎么调用:通过类来调用 - 类.类方法
3)特点:参数cls不需要传参,系统会自动将当前类传给cls
3静态方法
1)怎么定义:定义函数前加@staticmethod
2)怎么调用:通过类来调用 - 类.静态方法
3)特点:没有特点
方法选择
如果实现函数的功能需要对象(对象属性)就用对象方法;如果需要类就用类方法,如果都不需要就用静态方法
构造方法和init方法
1.构造函数 - 名字和类名一样,专门用来创建对象的函数
python中创建类的时候,系统会自动为我们创建这个类的构造函数
补充:魔法方法的特点
1)方法名是__ 开头并以__结尾
魔法方法不需要程序员主动调用,在特定事件被触发后系统会自动调用
2.__init__方法
当通过类创建对象的时候,类中的__init__方法会被自动调用
(每次通过类创建对象的时候,类中的__init__都会被自动调用)
class Student:
def __init__(self):
print('init方法')
stu1=Student()
stu2=Student()
"""
通过类创建对象的时候需不需要参数,需要几个参数,由这个类中的__init__决定。(看__init__除了self以外有没有额外的参数)
"""
class Dog:
def __init__(self,x,y):
print('init方法:',x,y)
dog=Dog(10,20)
dog=Dog(x=100,y=200)
(2) 属性
属性分为:对象属性和类属性(字段)
1类属性
1)怎么定义:直接在类中定义一个变量,这个变量就是类属性
2)怎么使用:通过类来使用——类.类属性
3)什么时候用:属性值不会因为对象不同而不一样就将这个属性定义成类属性
2对象属性
1)怎么定义:以‘self.属性名=值’的形式定义在__init__方法中
2)怎么使用:通过对象来使用 - 对象.对象属性
3)什么时候用:属性会因为对象不同而不一样就将这个属性定义成对象属性
class A:
# x是类属性
x=100
def __init__(self):
self.y=200
print(A.x)
a=A()
print(a.y)
a.y=20
print(a.y)
class Circle:
pi=3.1415926
def __init__(self):
self.r=0
# 3.__init__方法的扩展
# 1)如果类需要对象属性,就需要在类中添加__init__
# 2)可以通过在__init__中添加参数来实现创建对象的时候直接给属性赋值
class Student:
def __init__(self,name):
self.name=name
作业
-
定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种 拥有方法:叫唤
人类拥有属性:姓名、年龄、狗 拥有方法:遛狗
class Dog:
def __init__(self,name,gender,vari):
self.name=name
self.gender=gender
self.vari=vari
@classmethod
def call(self):
print('汪')
class People:
def __init__(self,name,age,dog:Dog):
self.name=name
self.age=age
self.dog=dog
def Walk(self):
print('会遛狗')
-
定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积
class rectangular: def __init__(self,width,height): self.width=width self.height=height def area(self): return self.width*self.height def peri(self): return (self.width+self.height)*2
-
定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离
class Point: def __init__(self,x,y): self.x=x self.y=y def distance(self,x2,y2): dist=((x2-self.x)**2+(y2-self.y)**2)**0.5 return dist
-
定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
class Circle: def __init__(self,r,center:Point): self.r=r self.center=center def area(self): return self.r **2*pi def peri(self): return self.r* 2 *pi def tangent(self,p2:Point,r2): if self.r+r2==Point(self.center.x,self.center.y).distance(p2.x,p2.y): print('这两个圆相切') else: print('这两圆不相切')
-
定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
class Line: def __init__(self,p1:Point,p2:Point): self.p1=p1 self.p2=p2 def long(self): return Point(self.p1.x,self.p1.y).distance(self.p2.x,self.p2.y)