DAY17 面向对象基础

DAY17 面向对象基础

一. 认识类和对象

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

  • 三种编程思想

    1.面向过程编程(穷人思想) - 基本语法和逻辑

    2.函数式编程(小资思想) - 基本语句和逻辑还需要函数

    3.面向对象编程(富豪思想) - 基本语句和逻辑,函数,类和对象

1.2 类和对象
  • 类 - 类是拥有相同功能或者相同属性的对象的集合(是一个抽象的概念)
  • 对象 - 对象是类的实例(是类的具体表现)
1.3 定义类(创建类)
  • 用代码来描述这个类到底拥有哪些相同功能和属性的对象的集合

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

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

  • 注解:方法 - 定义在类中的函数
    属性 - 定义在类中的变量

  • 说明:

    • class - 关键字;固定写法

    • 类名 - 由程序员自己命名,必须符合要求和规范

      要求:是标识符;不能是关键字

      规范:见名知义;
      采用驼峰式命名(由多个单词组成,单词间通过字母大写来区分),
      第一个字母大写;
      不使用系统的函数名,类名或者模块名

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

      方法包括:对象方法,类方法,静态方法三种

      属性包括:类属性(字段)和对象属性两种

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

class Dog:
    """
    狗类
    """
1.4 创建对象
  • 对象是类的实例,创建对象必须通过类来创建

  • 语法:
    对象 = 类名()

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

# 创建一个狗的对象
dog = Dog()
print(dog)    # <__main__.Dog object at 0x0000020520C17F40>

二. 方法

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

2.1 对象方法
  1. 怎么定义:直接定义在类中的函数
  2. 怎么调用:通过对象来调用 - 对象.对象方法()
  3. 特点:用对象调用对象方法的时候,参数self不需要传参,系统会自动将当前对象传给self(谁去调用这个方法当前对象就是谁)
2.2 类方法
  1. 怎么定义:定义函数前加@classmethod装饰器
  2. 怎么调用:通过类来调用 - 类.类方法()
  3. 特点:参数cls不需要传参,系统会自动将当前类传给cls
2.3 静态方法
  1. 怎么定义:定义函数前加@staticmethod装饰器
  2. 怎么调用:通过类来调用 - 类.静态方法()
  3. 特点:没有特点(类里面的普通函数)
class A:
    """
    无意义的类
    """
    def func1(self):
        print('对象方法')
        print(self)

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

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


# 创建A的对象
a1 = A()
'''
对象方法
<__main__.A object at 0x0000029645317F10>

'''
print(a1)   # <__main__.A object at 0x000002092B587F10>
# 用对象调用对象方法
a1.func1()

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

# 用类调用静态方法
A.func3()
2.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, y):
        print(x, y)


b = B()
b.func1(100)
b.func1(100, 200)

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

三. 构造函数和init方法

  1. 构造函数 - 名字和类名一样,专门用来创建对象的函数

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

补充:魔法方法的特点
1)方法名是__开头并以__结尾
2)魔法方法不需要程序员主动调用,在特定时间被出发都系统会自动调用

  1. __init__方法
  • 当通过类创建对象的时候,类中__init__方法会被自动调用
    (每次通过类创建对象的时候,类中的__init__都会被自动调用)
class Student:
    def __init__(self):
        print('init方法')


stu1 = Student()  # init方法   (运行调用输出)
  • 通过类创建对象的时候需不需要残烛,需要几个参数,有这个类中的__init__决定
    (看__init__除了self以外有没有额外的参数)
class Dog:
    def __init__(self, x, y):
        print('init方法', x, y)


dog = Dog(10, 20)

四. 属性

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

4.1 类属性
  1. 怎么定义:直接在类中定义一个变量,这个变量就是类属性
  2. 怎么使用:通过类来使用 - 类.类属性
  3. 什么时候用:属性不会因为对象不同而不一样就将这个属性定义成类属性
4.2 对象属性
  1. 怎么定义:以’self.属性名 = 值’的方式定义在__init__方法中
  2. 怎么使用:通过对象来使用 - 对象.对象属性
  3. 什么时候用:属性会因为对象不同而不一样就将这个属性定义成对象属性
class A:
    # x是类属性
    x = 100

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


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

a = A()
print(a.y)  # 200
a.y = 300
print(a.y)  # 300


class Circle:
    pi = 3.1415926

    def __init__(self):
        self.r = 0
4.3 __init__方法的扩展
  1. 如果类需要对象属性,就需要在类中添加__init__
  2. 可以通过在__init__中添加参数,来实现创建对象的时候直接给属性赋值的目的
class Student:
    def __init__(self, name, gender='男'):
        self.name = name
        self.gender = gender
        self.age = 0


s1 = Student('li', '女')
print(s1.name, s1.gender, s1.age)     # li 女 0

五. 方法的选择

  1. 选择
  • 如果实现函数的功能需要对象(对象属性)就用对象方法;
  • 如果需要类就用类方法;
  • 如果都不需要就用静态方法
  1. 对象方法的使用
class Rect:
    def __init__(self, width=0, height=0):
        self.width = width
        self.height = height

    def perimeter(self):
        return (self.width + self.height) * 2

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

r1 = Rect(10, 20)
r2 = Rect(5, 8)
print(r2.area())  # 40
# 练习:定义一个圆类,拥有属性半径和圆周率,拥有方法:求面积和求周长
class Circle:
    pi = 3.1415926

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

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

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


c1 = Circle(3)
print(c1.area())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值