对象
将对象的属性和行为包装起来
对象=属性+方法
类的创建
对象的实例化以及方法的调用
面向对象的特征
封装(封装了属性和方法,成为一个独立性的模块,相当于信息的隐蔽),继承(子类自动共享父类之间数据和方法的机制),多态(不同对象对同一方法响应不同的行动)
类的继承以及子类对象的实例化和方法属性的继承,pass是占位符
self是什么?
self相当于Java中的this,将相当于类的自身。默认self是类中方法的第一个参数。
self在类的内部,相当于类的对象
Python的魔法方法
--init--(self) 方法,相当于类的构造方法,在类的实例化的时候就会被自动调用。
可以在类中重写--init--(self)方法,添加参数和添加方法体。
python的方法参数如果有默认值,那么在调用的时候参数也是可选的(类似于kotlin)
公有和私有
默认的属性和函数都是公有的
在Python中定义私有变量只需要在变量名或者函数名前加上--两个下划线,那么这个函数或变量就变成私有的。私有的属性可以使用方法在内部调用,然后再通过对象调用该方法就可以调用这个私有属性。私有属性加上双下划线其实内部就是将属性名变成了“-类名--属性名”,那么我们就可以使用对象调用这个变量了。方式:对象名.-类名--属性名,所以说python的私有是伪私有。
继承
继承的方式
如果子类中定义与父类同名的方法或者属性,则会自动覆盖父类对应的方法或者属性。
在子类中重写方法时,如果还想要父类的方法,有两种方法。
----调用未绑定的父类方法
调用未绑定的父类方法
----使用super函数
使用super 函数调用想要用的方法,不用传入self参数
当super要调用的参数需要传参时,那么必须传参,相当于普通调用
多重继承
多重继承的形式
组合
把几个没有继承关系,没有直线关系的类放到一起。
将几个类在一个类的构造函数里面实例化出来。
Mix-in
类,类对象和实例对象
类里面的属性都是静态的,和类对象相互绑定。不会受实例对象的影响。如果属性的名字和方法相同,属性会把方法覆盖掉。
类的实例对象也可以自己创建属性。
一些约定俗成的规定:
1.不要试图在一个类里定义出所有能想到的特性和方法,应该通过继承和组合来进行拓展。
2.用不同的词进行命名,如属性名用名词,方法名用动词。
尽量使用实例对象的属性,少用类对象的属性。
什么是绑定?
Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念。
实例对象在声明创建时已经在内存中有了自己的空间,和类对象是分开的,互不干扰。即使类对象被删除,实例对象还是存在。但是类对象被删除之后,就不能再创建实例对象了。只有在程序退出实例对象才会从内存中销毁。
跟类相关的内置函数(BIF)
issubclass(class,classinfo)
如果第一个参数class是第二个参数class info的子类就返回true。但这种方法是非严格的方法。
1.一个类也会被认为是自身的子类。2.classinfo可以是类对象的组成的元祖,只要class与其中任何一个候选类的子类,则返回True,否则False
isinstance(object,classinfo)
检查object是不是classinfo的实例对象
1.如果第一个参数不是对象,则永远返回false。2.如果第二个参数不是类或者由类对象组成的元组,会抛出TypeError异常。
hasattr(object,name)
判断object对象里面有没有name属性。name要是属性的名字,是字符串类型的。
getattr(object,name[,default])
获取object实例对象的name属性的值,如果name属性不存在,那么就得到default,如果default不存在,那么就会抛出异常。
setattr(object,name,value)
给object实例对象的name属性赋值value,如果属性name不存在,则新建属性name并赋值。
delattr(object,name)
删除object实例对象的name属性。如果属性不存在,则抛出异常。
property(fget=None,fset=None,fdel=None,doc=None)
通过属性来设置属性。第一个参数是获取属性的方法,第二个是设置属性的方法,第三个是删除属性的方法。我们可以根据这个函数操作其他属性的获取,设置,删除。
property方法的好处就是,当我们提供给用户的setSize,getSize方法需要修改时,就会很麻烦。如果我们提供给用户的是x,那么我们就可以随便修改方法,然后修改property的参数就可以,提供给用户的x没有变。