类 classpython
抽象概念编程
是属性与方法的集合数据结构
对象/实例 instance/objectapp
类的具体实现/实例化ide
属性函数
对象状态的抽象,用数据结构描述this
操做/方法spa
对象行为的抽象,用操做名和实现该操做的方法来描述3d
一切皆对象对象
对象是数据和操做的封装
对象是独立的,可是对象之间能够互相做用
目前OOP是最接近人类认知的编程范式
面向对象的OOP三要素
封装
组装:将数据和操做组装到一块儿
隐藏数据:对外只暴露一些接口,经过接口访问对象
继承
多复用
少修改
OCP开闭原则 对扩展开放,对修改关闭
多态
动态绑定:面向对象最灵活的地方
Python的类
类名必须用大驼峰命名
必须使用class 的关键字
类定义完成产生的对象,绑定到了标识符ClassName上
类对象及类属性
类对象
类定义会生成一个类对象
类属性
类定义中的变量和类中定义的方法都是类属性
类变量,
方法对象method 通常至少有一个参数self(第一个参数能够是self 也能够是其余值可是规定使用self
self指代当前实例自己,相似Java的this
实例化
在类对象名称后面加上一个括号,即实例化
通常状况下类能够生成多个实例
每次实例化得到的实例都是不一样的,即便使用一样的参数实例化
Python类实例化会先自动调用类或其超类内部的new方法,再调用init方法
若是类没有定义init,会隐式调用
init做用:对实例进行初始化,相似Java的构造器
init方法不能有返回值,只能是None
实例对象(instance)
类实例化后必定得到一个对象,就是实例对象。
self.name name是保存在了实例上,并非类上
说明self 就一个调用者,就是c对应的对像
实例变量和类变量
实例变量是每个实例本身的变量,是本身独有的;类变量是类的变量,是类的全部实例共享的属性和方法
特殊属性
__name__ 对象名
__class__ 对象的类型
__dict__ 对象的属性的字典
__qualname__ 类的限定名
总结:
是类的,也是这个类全部的实例的,其实列均可以访问到的;是实例的,就是这个实例本身的,经过类访问不到。
Python中每一种对象都拥有不一样的属性。函数、类都是对象,类的实例也是对象
实例属性的查找顺序
实例使用.来访问属性,会先找本身的dict,若是没有,经过属性class找到本身的类,再去类的dict中找
通常来讲。类变量使用全大写命名
装饰类
def add_name(name): def wrapper(value): value.NAME=name return value return wrapper @add_name('a') # A=add_name(A)('a')class A: AGE=8
装饰类就是为了类添加一个属性,经过标识符指向这个类的对象。
类方法和静态方法
类方法
在类定义中,使用@classmethod装饰器修饰方法
必须至少有一个参数,且第一个参数留给cls,cls指代调用者即类对象自身
cls这个标识符能够是任意合法名称,可是为了易读,不要修改
经过cls能够直接操做类的属性
相似C++、Java中的静态方法
静态方法
在类定义中,使用@staticmethod装饰器修饰的方法
调用时不会隐式传入参数
!静态方法;只是代表这个方法属于这个名词空间,函数归在一块儿,方便组织管理
调用方法
类几乎均可以调用素有内部定义的方法,可是调用普通方法会出错的,缘由是第一参数必须是类的实例,实例也几乎是调用的全部的方法,普通函数调用哟办不会这么出现,由于不能这么出现,由于不与容许这么定义
类除了普通方法均可以调用,普通方法须要对象的实例做为第一参数
实例能够调用全部类中定义的方法,普通方法传入实例自身,静态方法和类方法须要找到实例的类
访问控制
私有属性(private)
使用双下划线开头的属性名
本质
类定义的时候,若是声明一个实例变量的时候,使用双下划线,Python解释器会将其更名为_类名__变量名,因此用原来的名字访问不到了。
用此变量名仍能够访问私有变量
保护变量
变量名前使用一个下划线
只是开发者共同约定
私有变量
参照私有变量、保护变量
属性装饰器
property装饰器
后面跟的函数名就是属性名,其自己就是getter 必须存在
setter装饰器
接受self,与将要赋值的值。
deleter装饰器
控制是否删除属性,不多用
property装饰器必须在前
方法一;
class Person: def __init__(self, name, age=18): self.name = name self.__age = age @property def age(self): return self.__age @age.setter def age(self, age): self.__age = age @age.deleter def age(self): print('del')
方法二:
class Person: def __init__(self, name, age=18): self.name = name self.__age = age def getage(self): return self.__age def setage(self, age): self.__age = age def delage(self): print('del') age = property(getage, setage, delage, 'age property')
方法三:
class Person: def __init__(self, name, age=18): self.name = name self.__age = age age = property(lambda self: self.__age)