机器学习基础知识笔记
- 面向过程:根据业务逻辑从上到下写垒代码。
- 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可。
- 面向对象:对函数进行分类和封装,让开发“更快更好更强…”
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)