python面向对象 l  面向对象

Python一切皆对象:https://www.cnblogs.com/magicking/p/8971740.html

类是抽象的模板,实例是根据类创建出来的一个个具体的”对象”, 定义了一个类,电脑并没有创建什么存储空间。只有当我们完成类的实例化(Instance)时,电脑才会创建一个具体的对象(Object),并为之分配存储空间。所以对象(Object)是类(Class)的一个实例。

https://www.yiibai.com/object_oriented_python/object_oriented_python_introduction.html

https://blog.csdn.net/42134789/article/details/80194788

http://c.biancheng.net/view/2263.html

访问限制

java有privatepublicprotected的访问限制,python根据变量和方法名来访问限制

l  私有变量/方法

名称以双下划线开头(__age),即私有的,只能在类内部访问,在外部不能访问是因为python解释器对外把__age改变成”_类名__age”;在类外使用使用people().__age=12,这不是对原来私有成员访问,而是添加一个新的实例变量__age

总结:

  • _name、_name_、_name__:建议性的私有成员,不要在外部访问;
  • __name、 __name_ :强制的私有成员,但是你依然可以蛮横地在外部危险访问;
  • __name__:特殊成员,与私有性质无关,例如__doc__;
  • name_、name__:没有任何特殊性,普通的标识符,但最好不要这么起名!

                                                                                                                                                           

类定义

class 类名(继承类):

         。。。。

.1     类对象创建和使用

#创建类对象

a = 类名(参数)   --调用类的__init__构造方法,a指向类对象,a为类实例

.2     方法

关键字self是个非常重要的参数,代表创建的对象本身

.2.1           初始化方法

def __init__(self,….)

         self.name=xxx

.2.1           释放方法

def __del__(self):  # 对象资源被释放时触发,在对象即将被删除时的最后操作

.3     类变量与实例变量

 python面向对象
l  面向对象

.3.1           类变量

  • 说明:类变量在整个实例化的对象中是公用的,由类直接访问,在内存中只保存一份,在类定义中cls代表类
  • 定义方式:定义在类中且在函数体之外,直接“变量名=xxx”来定义
  • 访问方式:在类定义中使用类名.变量名或者self.__class__.变量名或cls.变量名,在类外使用类名.变量名。self.__class__自动返回每个对象的类名
  • 说明:由对象来访问,在内存中每个对象都要保存一份,在类定义中self代表实例对象
  • 定义方式:定义在方法中的变量,属于某个具体的对象,使用self.变量名定义
  • 访问方式:在类定义中使用self.变量名,在类外使用对象名.变量名访问
  • 特殊说明:python是动态语言,可以根据类实例来任意绑定属性;通过实例变量或self变量

.3.2           实例变量

.4     类方法与实例方法

与某个对象进行绑定的函数称为方法;类外定义的函数没有同对象进行绑定,称为函数。

.4.1           类方法

  • 说明:类方法只属于类,方法第一个参数使用cls代表类方法
  • 定义方式:def 方法名(cls,);方法定义时使用cls代表类方法,另我们习惯方法上加@classmethod的修饰符

@classmethod

def xxx(cls,)

                   cls.类变量

  • 访问方式

__init__.py

test  --test目录层次

         __init__.py

         test_a.py

         test_b.py

包含__init__.py文件的文件夹为模块,每个模块包中都有一个__init__.py文件,当import包时,会执行__init__.py文件,这样可以在__init__.py文件中批量导入我们所需要的模块,而不是一个个的导入

__init__.py文件的内容可以如下:

 python面向对象
l  面向对象

__init__.py文件的作用

l  __init__.py文件中导入需要使用的模块

import test

test.os 

把需要导入大量模块,存放在__init__.py文件中,这样直接导入该包,就可以使用了,减少代码量

l  __init__.py文件里存放模块的全局变量和公共方法

如定义变量a,或函数,或类;使用test.a调用

l  __all__变量的作用

__init__.py文件中可以使用__all__变量来直接限制from test import *时导入的模块,如上图,会导入test_a,test_b,os模块,其中a导入不了,就无法使用a

使用方式

l  使用import test

直接导入test包,执行__init__.py文件

test.a  --调用a变量

test.os --调用os模块

test.test_a  --报错,无法调用,因为只导入了test包,没有导入该包下的模块

l  使用 from test import *

#无__all__变量时

执行__init__.py文件,导入该包下的所有模块和该文件中变量和方法,可以调用a,os,test_a,test_b

#有__all__变量时

执行__init__.py文件,导入该变量指定的模块,可以调用os,test_a,test_b

l  使用 from test import a

执行__init__.py文件,只会导入a