机器学习基础(五)Python知识串讲---面向对象

机器学习基础知识笔记

  • 面向过程:根据业务逻辑从上到下写垒代码。
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可。
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强…”

1. 面向对象的概念

  • 面向对象编程,认为世间万物一切皆是“对象”,需要高度抽象的思维方式去体会这个概念,对象代表的是实体。需要高度抽象的思维方式去体会概念。对象存在着自己独有的状态和行为。
  • 抽象过程是面向对象的一种分析方法,抽象过程就是要分析出对象都存在哪些属性(状态)和方法(行为)。
  • 类就是类别的意思,同一类别的事物都会有共同的属性(状态)或方法(行为)。
  • 对象就是类的一个具体表现事物,任何对象都拥有相同的属性和方法(即类中的所有属性和方法),每个对象的属性或方法会有独特的各异性。
  • 继承:子类拥有父类的可访问属性和方法,提高代码的重用性;
  • 封装:通过语块保护变量或对象的作用域,提高代码的安全性;
  • 多态:各种重载和重写的机制,提高代码灵活幸亏。

2. 面向对象编程

# 类是具有相同行为和属性的一类对象的抽象
class Animal():
    # 类属性和类方法
    type = "动物类"

    @classmethod  # 类方法
    def showType(cls):  # cls = Animal
        print(cls.type)
        pass

    @staticmethod  # 静态方法
    def add(a, b):  # 普通参数
        pass

    # 成员属性在python中必须用self去定义,也可以用成员方法去定义
    # 建议把创建属性置于类的构造函数中
    def __init__(self, name,  age=2):  # python类定义属性,必须使用self定义 __init__是类的构造函数
        self.name = name  # 成员属性,成员属性是属于对象的, 这种属性是公有属性
        self.__age = age  # 私有属性,前面加两个下划线
        self._weight = 100  # 保护类型的属性
        pass

    def eat(self, food):  # 成员方法
        self.color = None
        print(self.name, self.__age, "岁", "在吃"+food)
        pass

    def _getAge(self):  # 私有的成员方法
        return self.__age
        pass

    def _getWeight(self):  # 保护类型的成员方法
        return self._weight
        pass
    pass

dog = Animal("二哈")
print(dog.name)
print(dog._weight)
# 私有的成员属性,在类的外部不可以访问
# 所以dog.__age无法访问
dog.eat("大棒骨")

# 在调用dog前,没有办法使用color,因为没有创建
#  这也是尽量将变量在构造函数中创建的原因
dog.color = "白色"
print(dog.color)

# 从这里可以看出,dog和cat这两个对象是在不同的内存中存储,不会发生覆盖
# 而类属性和类对象是共用一块内存
cat = Animal("小花")
print(dog.name)
print(cat.name)

print(dog.type)
print(cat.type)
print(Animal.type)
Animal.type = "犬类"
print(dog.type)
print(cat.type)
print(Animal.type)
# 说明type是共用一块内存的
# python可以为对象动态地添加属性和方法
# 这条代码并不是更改Animal类的type,而是python为dog动态添加了方法和属性,然后进行赋值
dog.type = "犬类"

3. 类的继承

# 类的继承,继承为了提高代码的可复用性和可扩展性
class Animal():
    # 类属性和类方法
    type = "动物类"

    # 成员属性在python中必须用self去定义,也可以用成员方法去定义
    # 建议把创建属性置于类的构造函数中
    def __init__(self, name,  age=2):  # python类定义属性,必须使用self定义 __init__是类的构造函数
        self.name = name  # 成员属性,成员属性是属于对象的, 这种属性是公有属性
        self.__age = age  # 私有属性,前面加两个下划线
        self._weight = 100  # 保护类型的属性
        pass

    def eat(self, food):  # 成员方法
        self.color = None
        print(self.name, self.__age, "岁", "在吃"+food)
        pass
    pass

class Dog(Animal):
    def __init__(self, name):
        super().__init__(name)  # 调用父类的方法
        pass
    def detect(self):
        print(self.name, "嗅探")
        pass
    pass

class Cat(Animal):
    def __init__(self, name):
        super().__init__(name)
        pass
    def climb(self):
        print(self.name, "爬树")
        pass
    pass

dog = Dog("大哈")
cat = Cat("小花")
dog.eat("肉")
cat.eat("鱼")
dog.detect()
cat.climb()

在这里插入图片描述
Python可以多继承,即Python的类可以有多个父类:

# python支持多继承
class Monster(Dog, Cat):
    def __init__(self, name):
        super().__init__(name)
        pass

    def fire(self):
        print(self.name, "喷火")
        pass
    pass

monster = Monster("四不像")
monster.fire()

在这里插入图片描述
在有继承类的语言中,会存在不同方法重名的问题,如果在子类中重写了父类中的方法,那么子类对象调用这一方法时会使用子类中重写的方法。但是在多继承时,如果两个子类中都有不同定义的同名方法,这种情况下会发生歧义。比如上述例子,monster.eat()可能会调用cat中的eat,或者原本方法中的方法,这种情况会中发生歧义。

# C3 算法
# 在继承时出现多个重名的方法(方法有重写),Python会按照C3算法
# 根据继承关系,给所有方法排序,然后按次序调用
print(Monster.mro())

在这里插入图片描述

4. Python的call机制

# python call 机制
class User(object):  # object所有类的直接或间接的父类

    def __init__(self, name, age, money):
        self.__name = name
        self.__age = age
        self.__money = money
        pass

    def __str__(self):
        print("调用了")
        return "-------"
        pass

    pass

user = User('zhangsan', 19, 1000.1111)
print(user)

在User中有str方法时,print()默认调用次方法,并输入相应内容:
在这里插入图片描述

如果注释掉User类中的str方法,那么print()会默认调用User默认继承的父类Object中的str方法,并输出:

# python call 机制
class User(object):  # object所有类的直接或间接的父类

    def __init__(self, name, age, money):
        self.__name = name
        self.__age = age
        self.__money = money
        pass

   # def __str__(self):
    #    print("调用了")
     #   return "-------"
      #  pass

    pass

user = User('zhangsan', 19, 1000.1111)
print(user)

在这里插入图片描述
重写str方法后,得到的结果:

# python call 机制
class User(object):  # object所有类的直接或间接的父类

    def __init__(self, name, age, money):
        self.__name = name
        self.__age = age
        self.__money = money
        pass

    def __str__(self):
        value = "姓名:{0}, 年龄:{1}, 余额:{2}".format(self.__name, self.__age, self.__money)
        return value
        pass

    pass

user = User('zhangsan', 19, 1000.1111)
print(user)

在这里插入图片描述

Python的call机制,在理解机器学习相关的代码中非常重要,一定要理解:

# python call 机制
class User(object):  # object所有类的直接或间接的父类

    def __init__(self, name, age, money):
        self.__name = name
        self.__age = age
        self.__money = money
        pass

    def __str__(self):
        value = "姓名:{0}, 年龄:{1}, 余额:{2}".format(self.__name, self.__age, self.__money)
        return value
        pass

    # call 机制使得Pyhon对象可以被当成方法调用
    def __call__(self, *args, **kwargs):
        print("__call__")
        print(args)
        print(kwargs)
        pass

    pass

user = User('zhangsan', 19, 1000.1111)
print(user)

# 对象+小括号,会直接调用类中的__call__方法
user('xngege', 19, m=10000102)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值