面向对象基础

本文介绍了面向对象编程的基础知识,包括面向过程、函数式编程和面向对象编程的编程思想。详细讲解了Python中的类和对象,如何定义和创建类,以及类的方法(对象方法、类方法、静态方法)。此外,还探讨了构造函数`__init__`、属性(对象属性和类属性)以及方法的选择。最后给出了面向对象编程的练习题,涉及狗、人、矩形、二维点和圆类的设计。
摘要由CSDN通过智能技术生成

1. 编程思想

编程思想:程序员在面对一个问题的时候首先想到的解决这个问题的想法。

1.1 面向过程编程

面向过程编程 - 会基本语法和逻辑。

1.2 函数式编程

函数式编程 - 会基本语法和逻辑还需要函数。

1.3 面向对象编程

面向对象编程 - 会基本语法和逻辑、函数 还需要类和对象。

# 练习:计算8的阶乘
s = 1
for x in range(1,9):
    s *= x

print(s)


import math
print(math.factorial(8))


def factorial(num):
    s = 1
    for x in range(1, num+1):
        s *= x
    return s


print(factorial(8))

2. 认识类和对象

2.1 什么是类和对象

2.1.1 类

类 - 类是对拥有相同功能和相同属性的对象的集合。(是一个抽象的概念)

2.1.2 对象

对象 - 对象是类的实例(是类的具体表现,具体的)

从生活的角度:

如果人是类,小明就是对象,小花是另外一个对象
如果杯子是类,我的杯子就是对象

2.2 定义类

定义类(创建) - 用代码来描述清楚这个类到底是拥有哪些相同功能和哪些相同属性的对象的集合。

功能 - 函数
属性 - 属性(保存数据的变量)

2.2.1 语法

class 类名:
类的说明文档
类的内容(包括方法和属性)

注解:

方法 - 定义在类中的函数
属性 - 定义在类中的变量

2.2.2 说明

1)class - 关键字;固定写法

2)类名 - 由程序员自己命名,必须符号命名要求和规范

要求:a. 是标识符;不能是关键字
b. 规范:见名知义;采用驼峰式命名(由多个单词组成,单词间通过首字母大写来区分,例如:studentName),第一个字母大写
c. 不使用系统的函数名、类名、函数名

3)类的说明文档 - 本质就是多行注释

4)类的内容 - 由方法和属性组成

方法包括:对象方法、类方法和静态方法三种
属性包括:类属性(字段)和对象属性两种

class Student:
    """学生类"""
    pass


class Dog:
    """狗类"""
    pass

2.3 创建对象

对象是类的实例,创建对象必须通过类来创建。

语法:对象 = 类名()

# 创建两个学生类的对象
s1 = Student()
s2 = Student()
print(type(s2))

# 创建两个狗的对象
dog = Dog()
print(dog)

3. 方法

类中的方法分为三种:对象方法、类方法、静态方法。

3.1 对象方法

3.1.1 怎么定义

怎么定义:直接定义在类中的函数就是对象方法。

3.1.2 怎么调用

怎么调用:通过对象来调用 - 对象.对象方法()。

3.1.3 特点

特点:用对象调用对象方法的时候,参数self不需要传参,系统会自动将当前对象传给self(谁去调用的这个方法,当前对象就是谁)。

3.2 类方法

3.2.1 怎么定义

怎么定义:定义函数前加@classmethod。

3.2.2 怎么调用

怎么调用:通过类来调用 - 类.类方法()。

3.2.3 特点

特点:参数cls不需要传参,系统会自动将当前类传给cls。

3.3 静态方法

3.3.1 怎么定义

怎么定义:定义函数前加@staticmethod。

3.3.2 怎么调用

怎么调用:通过类来调用 - 类.静态方法()。

3.3.3 特点

特点:没有特点。

class A:
    """无意义的类"""

    def func1(self):
        print('对象方法')
        print(f'self:{self}')

    @classmethod
    def func2(cls):
        print('类方法')

    @staticmethod
    def func3():
        print('静态方法')


# 创建A的对象
a1 = A()
print(f'a1:{a1}')

# 用对象调用对象方法
a1.func1()

# 用类调用类方法
A.func2()

# 用类调用静态方法
A.func3()

3.4 类中函数的参数

class B:
    def func1(self, x, y=10):
        print(f'x:{x}, y:{y}')

    @classmethod
    def func2(cls,x,*,y,z):
        print(f'x:{x}, y:{y}, z:{z}')

    @staticmethod
    def func3(x:int,y):
        print(f'x:{x}, y:{y}')


b = B()
b.func1(100)    # x:100,y:10
b.func1(100,200)
b.func1(x=11,y=12)

B.func2(10,y=20,z=30)

B.func3(10,20)

4. 构造函数和init方法

4.1 构造函数

构造函数(了解) - 名字和类名一样,专门用来创建对象的函数就是构造函数。

python中创建类的时候,系统会自动为我们创建这个类的构造函数。

4.1.1 补充魔法方法的特点

1)方法名是__开头并以__结尾;

2)魔法方法不需要程序员主动调用,在特定事件被触发以后系统会自动调用。

4.2 __init__方法

4.2.1

当通过类创建对象的时候,类中的__init__方法会被自动调用。
(每次通过类创建对象的时候,类中的__init__都会被自动调用)

class Student:
    def __init__(self):
        print('init方法')


stu1 = Student()
stu2 = Student()
4.2.2

通过类创建对象的时候需不需要参数,需要几个参数,由这个类中的__init__决定。(看__init__除了self以外有没有额外的参数)。

class Dog:
    def __init__(self, x, y):
        print('init方法', x, y)


dog1 = Dog(10, 20)
dog2 = Dog(x=100, y=200)

5. 属性

属性分为:对象属性和类属性(字段)。

5.1 类属性

5.1.1 怎么定义

怎么定义:直接在类中定义一个变量,这个变量就是类属性。

5.1.2 怎么使用

怎么使用:通过类来使用 - 类.类属性。

5.1.3 什么时候用

什么时候用:属性值不会因为对象值不同而不一样就将这个属性定义成类属性。

5.2 对象属性

5.2.1 怎么定义

怎么定义:以’self.属性名=值’的形式定义在__init__方法中。

5.2.2 怎么使用

怎么使用:通过对象来使用 - 对象.对象属性。

5.2.3 什么时候用

什么时候用:属性值会因为对象值不同而不一样就将这个属性定义成对象属性。

class A:
    # x是类属性
    x = 10

    # y是对象属性
    def __init__(self):
        self.y = 200


# 通过类使用类属性
print(A.x)    # 10

A.x = 200
print(A.x)    # 200

# 通过对象使用对象属性
a = A()
print(a.y)
a.y = 300
print(a.y)


class Circle:
    # 圆周率是类属性
    pi = 3.1415926

    # 圆的半径是对象属性
    def __init__(self):
        self.r = 4

5.3 __init__方法的扩展

5.3.1

如果类需要对象属性,就需要在类中添加__init__。

5.3.2

可以通过在__init__中添加参数来实现创建对象的时候直接给属性赋值的目的。

class Person:
    def __init__(self, name, gender='男'):
        self.name = name
        self.gender = gender
        self.age = 0


p1 = Person('小明')
p2 = Person('小花','女')
print(p1.name, p1.gender)    # 小明 男
print(p2.name, p2.gender)    # 小花 女

6. 方法的选择

6.1 方法

如果实现函数的功能需要对象(对象属性)就用对象方法;如果需要类就用类方法;如果都不需要就用静态方法。

6.2 对象方法的使用

class Rect:
    def __init__(self, width=0, height=0):
        self.width = width
        self.height = height

    # 在实现对象方法的功能的时候如果需要的数据是对象相关数据,那么这个数据就由self来提供。
    def area(self):
        # self =
        return self.width * self.height


r1 = Rect(10, 20)
r2 = Rect(5, 8)
print(r2.area())
print(r1.area())
6.2.1 练习

练习:定义一个圆类,拥有属性半径和圆周率,拥有方法:求面积和求周长。

class Circle:
    # 类属性
    pi = 3.1415926

    def __init__(self,r):
        self.r = r

    def area(self):
        # 这个类的对象能做的事情,self都可以做
        return Circle.pi * self.r ** 2

    def perimeter(self):
        return 2 * Circle.pi * self.r


r1 = Circle(4)
print(r1.area())
print(r1.perimeter())

7.作业

  1. 定义一个狗类和一个人类:

    狗拥有属性:姓名、性别和品种 拥有方法:叫唤

    人类拥有属性:姓名、年龄、狗 拥有方法:遛狗

    class Dog:
        def __init__(self, name, gender, breed):
            self.name = name
            self.gender = gender
            self.breed = breed
    
        def bark(self):
            return f'{self.name}在叫唤'
    
    
    dog = Dog('旺财','男','泰迪')
    print(dog.bark())    # 旺财在叫唤
    
    
    class Person:
    
        def __init__(self, name, age, dog):
            self.name = name
            self.age = age
            self.dog = dog
    
        def stroll(self):
            return f'{self.name}在遛{self.dog}'
    
    
    p1 = Person('小花',18,'泰迪')
    print(p1.stroll())
    
  2. 定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积

    class Rectangle:
        def __init__(self, length, width):
            self.length = length
            self.width = width
    
        def perimeter(self):
            return (self.length + self.width) * 2
    
        def area(self):
            return self.length * self.width
    
    
    rec = Rectangle(10, 5)
    print(rec.perimeter())
    print(rec.area())
    
  3. 定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离

    class Point:
        def __init__(self, x, y):
            self.x = x
            self.y = y
    
        def distance(self, point):
            return ((self.x - point.x) ** 2 + (self.y - point.y) ** 2) ** 0.5
    
    t1 = Point(1,1)
    print(f'两点间的距离为{t1.distance(Point(0, 0))}')
    
  4. 定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切

    class Circle:
        pi = 3.1415926
    
        def __init__(self, r, x, y):
            self.r = r
            self.x = x
            self.y = y
    
        def perimeter(self):
            return 2 * Circle.pi * self.r
    
        def area(self):
            return Circle.pi * self.r ** 2
    
        def excircle(self,circle):
            if ((self.x - circle.x) ** 2 + (self.y - circle.y) ** 2) ** 0.5 == self.r + circle.r:
                return f'两个圆是外切'
            return f'两个圆不是外切'
    
    c1 = Circle(2, 2, 1)
    print(c1.excircle(Circle(1, 5, 4)))
    
  5. 定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度

    class LineSegment:
        def __init__(self, begin, end):
            self.begin = begin
            self.end = end
    
        def length(self):
            return abs(self.end - self.begin)
    
    
    l1 = LineSegment(-1,-9)
    print(l1.length())
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值