Python3-面向对象
面向对象是一中编程思想,具有 封装、继承、多态三大特性
Python从一开始设计就是面向对象的,并且结构上支持OOP,但Python并不会强制你写面向对象的代码,面向对象是一中概念性的东西,讲的是Everything is object,通过面向对象思想写出来的程序具有更好的扩展性,这个东西需要通过不断的编程,进行经验的积累,才能进行深入理解
Python中的类
Python2.x默认都是经典类,只有显式继承了object才是新式类
Python3.x默认都是新式类,废除了经典类
注:
新式类与经典类最大的区别就是继承搜索顺序的不同:
新式类(广度优先)
经典类(深度优先)
类的一些特殊属性
__dict__
类的属性(包含一个字典,由类的数据属性组成)
__doc__
类的文档字符串
__name__
类名
__module__
类定义所在的模块
__bases__
类的所有父类构成元素(包含了一个由父类组成的元组)
类的一些特殊方法
__init__(self[, *args])
构造方法 简单的调用obj = ClassName(args)
__del__(self)
析构方法 简单的调用del obj
__repr__(self)
转化为供解释器读取的形式 简单的调用repr(obj)
__str__(self)
用于将值转化为适于人阅读的形式 简单的调用str(obj)
__cmp__(self, x)
对象比较 简单的调用cmp(obj,x)
class MyClass(object): """ 类的文档字符串 """ attr = "类的属性" _protected_attr = "类的受保护属性" __private_attr = "类的私有属性" def __init__(self, name): """ 构造方法 """ self.name = name # 实例属性 pass @property def private_attr(self): """ 把方法变成属性,多用于访问私有变量 getter :return: """ return self.__private_attr @private_attr.setter def private_attr(self, value): """ 通过方法设置属性值 setter :return: """ self.__private_attr = value def common_method(self): """ 实例方法,和实例有关系的方法 推荐只调用实例变量 :return: """ print(self.name) @classmethod def class_method(cls): """ 类方法,只和类有关系的方法 推荐只调用类变量 :return: """ print(cls) @staticmethod def static_method(): """ 静态方法,和类、实例都没有关系,只是属于这个类而已 不能调用类变量和实例变量 多为一些与类或实例有关的工具方法而已 :return: """ pass
封装
封装隐藏类的实现细节,避免用户通过不规范的操作来存取封装的数据属性
继承
继承最主要的功能是代码的复用,Python支持多继承,所有类的顶级父类是object
注:
1.在继承中基类的构造方法__init__()不会被自动调用,需要在子类中手动调用
2.新式类的继承查找顺序是广度优先,经典类的继承查找顺序是深度优先
3.Python支持"多重继承"
class Father: def talk(self): print("I'm Laowang, My name is %s" % self.name) class LaoWang: def __init__(self, name): print("This is LaoWang") self.name = name # 实例变量属于实例,不属于类 def papapa(self): print("Pa pa pa...") class Child(Father, LaoWang): def __init__(self): # super()代表他所有的父类,当调用__init__方法的时候,它会先找Father,Father中没有,在找的Laowang # 查找算法叫做MRO,即广度优先 super().__init__("Jet") super().papapa() # 实例化 child = Child() child.talk()
多态
Python不支持多态,换句话说,Python本身就是"多态"的,因为它是弱类型语言,对象的类型由Python解释器自识别转换
反射
通过"字符串"操作"类"的成员,Python中主要提供了4个内置函数来实现反射
hasattr(obj, "attr_name")
getattr(obj, "attr_name")
delattr(obj, "attr_name")
setattr(obj, "attr_name", value)
关于访问修饰符
Python中没有类似于Java中的private、protected、public这样的特定关键字,是使用特殊写法来进行区分的
1.private[Java]: __xxx
这样的属性与方法就相当于私有的,不能类外部直接访问
2.protected[Java]: _xxx
这样的属性与方法就相当于受保护的,但是按照约定俗成的规定,是可以被类外部直接访问的
但是,当你看到这样的变量时,意思是"虽然我可以被访问,但是请把我视为私有变量,不要随意访问"
3.public[Java]: xxx
默认的,不带下划线的,都属于公共的,可以随意访问
注意:
1.类似于__xxx__这样写法的属性和方法是特殊变量,特殊变量是可以直接访问的,不是private变量,Python保留的命名
2.Python的私有变量__xxx是不是一定不能从外部访问呢?其实也不是,我们可以通过这样的方式来进行访问
实例对象._类名__xxx
但是,强烈不建议你这么干,因为不同版本的Python解释器可能会把xxx改成不同的变量名
总的来说,Python本身没有任何机制阻止你干坏事,一些全靠自觉
3.访问权限的规则和Java差不多,能用小的权限,就不要用大的
posted on 2017-04-12 16:05 AustralGeek 阅读(215) 评论(0) 编辑 收藏 举报