天天看点

Day 14 - 面向对象1

Day 14

面向对象

编程思路

1.面向过程编程(逻辑)
在遇到问题时,直接用算法或步骤解决问题
2.函数式编程(函数)
在遇到问题时,考虑现有函数能否解决问题,有则用,无则自定义
3.面向对象编程(类和对象)
在遇到问题时,考虑一个对象是否拥有解决这个问题的功能,有则用,无则自定义

类和对象

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

对象就是类的实例

两者相互对应,一个类可以有多个对象

  • 定义类
    语法:
    class 类名:
     	类的说明文档
     	类的内容
               
    说明:
    • class

      固定写法

    • 类名

      程序员自定义(1.必须是标识符2.不是关键字)用驼峰命名法且首字母大写

    • 说明文档

      类的说明注释

    • 类的内容

      包括方法(对象方法、类方法和静态方法)和属性(对象属性和类属性)

    方法:
    方法本质就是定义在类中的函数,用来对类的功能进行描述
    属性:
    属性就是在类中保存数据的变量,用来对类的属性进行描述
class Person:
    """

    """
    def sleep(self):
        print('sleep')
    
    def eat(self):
        print('eat')


# 定义对象
'''
类名()
'''
p1 = Person()
p2 = Person()
print(p1, p2)
           

对象方法

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

对象方法自带self参数,用对象调用方法时参数self不需要传参,系统会自动将当前对象传给self(谁调用就指向谁)

通过" 对象.方法名 "的形式来调用

class Dog:
    def eat(self, food='bloon'):
        print(f'self:{self}')
        print(f'eat {food}')


# 创建一个Dog类的对象,保存在d1中
d1 = Dog()
print(f'd1:{d1}')
# 通过对象条用对象方法
d1.eat()
d1.eat('shit')
           

构造方法和init方法

  • 构造函数(方法)
    函数名和类同名,专门用来创建对象的函数就是构造函数(方法)
    class Person:
        pass
    
    
    # Person()就是一个函数但是我们并没有定义这个函数,系统在我们定义类时已经帮我们自动创建了一个同名函数
    p = Person()
    
    ''':伪代码(Python中调用构造函数创建对象的时候完成的操作)
    def Person(*args, **kwargs):
        对象 = 创建对象 - 1.调用__new__函数创建对象
        对象.__init__(*args, **kwargs) - 2.调用__init__方法,对对象进行初始化
        return 对象 - 3.返回初始化完成后的对象
    '''
               
  • init方法

    魔法方法:类中用__开头和__结尾的方法

    init方法会被系统在特定情况下自动调用(不需要程序员手动调用)

    __init__:每次通过类创建对象的时候,系统都会自动调用这个方法

    ​ 创建对象的时候构造函数的参数数量与init方法出self以外的参数数量对应

    ​ 如果需要给类添加init方法只需要保证__init__为方法名,方法的性质位对象方法

    class PersonPro:
        def __init__(self, *args, **kwargs):
            print('init方法被调用')
    
    
    p1 = PersonPro()
    p2 = PersonPro()
               

属性

  • 类属性(类的字段)
    • 定义:直接定义在类中但在函数外的变量
    • 使用:通过" 类.属性名(变量名)"的形式来调用
    • 应用场景:属性值不会因为对象不同而改变的属性使用类属性
  • 对象属性
    • 定义:以" self.属性名 = 值"的形式定义在__init__方法中
    • 使用:以" 对象.属性名 "的形式来调用
    • 应用场景:属性会因为对象不同而改变的属性使用对象属性
    class Person:
        # num是一个类属性
        num = 100
        def func1(self):
            print('此函数被调用')
            # _不是类属性
            _ = 100
            # 类属性的调用
            print(Person.num)
        # a是一个类属性
        a = 'abc'
        
        # name和age就是对象属性
        def __init__(self, name, gender='不明'):
            print('init函数被调用')
            self.name = name
            self.age = '默认值'
            self.gender = gender
    
    
    # 类属性的调用
    print(Person.a, Person.num)
    # 对象属性的调用
    p = Person('xiaoming')            # 创建对象
    print(p.name, p.age, p.gender)
    p.gender = 'male'
    print(p.gender)
               
    # 练习:定义一个点类,属性:x坐标、y坐标,方法:打印当前点的信息(x,y)
    # 要求:创建点对象的时候可以给坐标赋值,不赋值时坐标为(0,0)
    # 添加方法:获取当前点到另外一个点的距离
    
    import math
    
    class Point:
        def __init__(self, x=0, y=0):
            self.x = x
            self.y = y
        def stamp(self):
            print(f'点的坐标为:({self.x},{self.y})')
        def step(self, other):
            distance = math.hypot(self.x-other.x, self.y-other.y)
            print('两点之间的距离为:', distance)
    
    dot1 = Point()
    dot1.stamp()
    
    dot2 = Point(10, 20)
    dot2.stamp()
    
    dot3 = Point(13, 16)
    dot3.step(dot2)