面向对象
三大特性
- 封装
- 继承
- 多态
封装
将数据、变量、函数封装到一个类中的过程就是类的封装。但也不是什么都要封装进类,类也有其独特的属性,
而不是什么数据、什么变量、什么函数都往里面塞;
- 动物属于一个类别,如果它实例成一个对象,那么这个对象就是某一个动物本身具体;所以我们定义类的时候, 就需要考虑到动物本身所具有的属性,而非将一些人独有的属性和一些人独有的动作方法添加进入动物的类中。
class Animal:
def bark(self):
print("独有的叫声")
def chi(self):
print("吃")
def he(self):
print("喝")
def la(self):
print("拉")
def sa(self):
print("撒")
def sleep(self):
print("睡")
class People:
def say(self):
print("独有的说话交流能力")
def chi(self):
print("吃")
def he(self):
print("喝")
def la(self):
print("拉")
def sa(self):
print("撒")
def sleep(self):
print("睡")
- 封装可以将一些可复用的方法进行统一调用
import hashlib
# md5加密一个字符串
hashlib_obj = hashlib.md5()
hashlib_obj.update("123456")
result = hashlib_obj.hexdigest()
上面是单独写在一个模块里,自上而下的就会自动的去执行
# 使用函数
import hashlib
def md5(origin):
hashlib_obj = hashlib.md5()
hashlib_obj.update(origin)
result = hashlib_obj.hexdigest()
return result
上面是写在一个模块里的函数里,加入别的地方也要进行使用,便进行导入该模块; 但是如果此模块写了各种各样的处理各种事情的函数时,不能够清晰的知道需要导入这个模块里的哪个函数;
如果我们定义一个字符串处理类,专门用于处理字符串异类的操作的。是不是以后有字符串相关操作的,都可以 到这里面来找;而且方向很明确,而不是在一个模块里存在各种各样的去找。
import hashlib
class StrUtil:
@staticmethod
def md5(origin):
hashlib_obj = hashlib.md5()
hashlib_obj.update(origin)
result = hashlib_obj.hexdigest()
return result
封装的主要体现在实例化函数后的一系列操作
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
stu = Student("学生1", 18)
__init__
初始化函数,会在类进行实例化时自动执行;但是这并不是python中的构造函数,执行 __init__
方法,默认会将创建的那个块区域的内存地址当self参数传递进去
__new__(cls, *args, **kwargs)
这个才是python的构造函数
__getattr__
获取类中的属性,快捷方法有getattr()
__setattr__
设置类中的属性,快捷方法有setattr()
self
,类中的方法需要由这个类的对象来触发执行(对象.方法名),且在执行时会自动将对象当做参数传递给self
, 以供方法获取对象中已封装的值。
除了self默认参数外,其他都与函数的定义和执行时一样的
封装的总结
- 将同一类的方法封装到一个类中
- 将数据封装到了对象中,在实例化一个对象时,可以通过
__init__
初始化方法在对象中封装一些数据,便于以后调用。