python设计工具包:接口、声明的异常抛出、类成员可访问性级别(针对人类的私有和受保护的方法)。
accessif的Python项目详细描述
访问
开始
什么是accessify
访问
是一个python
设计工具包,提供:
- 接口,
- 声明的异常抛出,
- 班级成员的无障碍水平。
它们可以相互结合,使您的代码更精简,而且此库的使用更合理。
访问修饰符
访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。 可访问性级别是从语言中的框中显示的,比如<代码>代码> >代码>代码>
classCar{privatestringStartEngine(){// Code here.}}
但是,python的这种方式并不相同。
动机
我们都是这里的成年人
这是python哲学的一部分
依赖于人为因素而不是解释器。- 有一个python约定,即对受保护和私有成员使用下划线前缀,这有点难看。 不是吗?例如,对于下面提供类A私有成员的代码。
classCar:def__start_engine(self,*args,**kwargs):pass
- 此外,私有和受保护的方法可以很容易地在类之外访问。这真的是一个推迟 正确设计系统以减少积压,增加技术债务。
classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
界面
接口是一个约定,它指定了一组方法和属性,这些方法和属性要求在任何实现类上都可用。 如果类实现了接口,但未实现其方法,则应引发相应的错误。界面在框中显示 语言如<代码> C++<代码>、<代码> C >和<代码> Java<代码>
interfaceHumanInterface{publicstringEatFood();}classHuman:HumanInterface{publicstringEatFood(){// Code here.}}
但是,python的这种方式并不相同。
动机
- 该接口在实现创建过程中进行检查,但实际上在执行过程中不会进行检查,如
python
中的abc模块。 - 接口要求实现的方法参数与接口中声明的参数匹配,abc-not.
- 许多提供接口的库不再受支持。
- 许多提供接口的库需要编写大量代码才能使用其功能,而这个库不需要。
如何安装
使用pip安装来自pypi的包。
$ pip3 install accessify
用法
访问修饰符
专用
- 私人成员只能在班级内进入。
在本例中,car
类包含一个名为start_engine
的私有成员。作为私有成员,不能访问它们
除非通过成员方法。私有成员启动引擎
只能通过名为运行
的公共方法访问
fromaccessifyimportprivateclassCar:@privatedefstart_engine(self):return'Engine sound.'defrun(self):returnself.start_engine()if__name__=='__main__':car=Car()assert'Engine sound.'==car.run()car.start_engine()
上面的代码将产生以下回溯。
Traceback (most recent call last): File "examples/access/private.py", line 24, in <module> car.start_engine() File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/accessify/main.py", line 92, in private_wrapper class_name=instance_class.__name__, method_name=method.__name__, accessify.errors.InaccessibleDueToItsProtectionLevelException: Car.start_engine() is inaccessible due to its protection level
使用示例来测试它。
通过curl
获取包含上述代码的示例,并通过python3
运行它。
$ curl -L https://git.io/fhASP > private.py $ python3 private.py
- 子类无法访问父私有成员。
在本例中,car
类包含一个名为start_engine
的私有成员。作为私有成员,不能访问它们
从子类中,在我们的例子中是tesla
。因此,由tesla
重写的方法run
类不能使用父类的启动引擎
成员。
上面的代码将产生以下回溯。
classCar{privatestringStartEngine(){// Code here.}}0
使用示例来测试它。
通过curl
获取包含上述代码的示例,并通过python3
运行它。
classCar{privatestringStartEngine(){// Code here.}}1
受保护
- 受保护的成员可以在其类内和通过派生类实例访问。
在本例中, 上面的代码将产生以下回溯。 使用示例来测试它。
通过 在本例中, 代码将正常工作。 使用示例来测试它。
通过 使用示例来测试它。
通过 在本例中,有一个名为 上面的代码将产生以下回溯。 使用示例来测试它。
通过 在本例中,有一个名为 上面的代码将产生以下回溯。 使用示例来测试它。
举个例子通过 在本例中,有一个名为 上面的代码将产生以下回溯。 使用示例来测试它。
通过 在本例中,有一个接口 上面的代码将产生以下回溯。 使用示例来测试它。
通过 在本例中,exception 上面的代码将产生以下回溯。 使用示例来测试它。
通过 您可以禁用所有访问检查。例如,在生产中,当您不应该检查它时,因为它已经被检查过了
正在开发中。然后使用以下环境变量: 克隆项目并安装要求: 如果您更喜欢使用docker并希望轻松更改python环境,请遵循: 输入container bash,选中 使用以下命令清理容器和图像: 当您要进行更改时,请确保您的代码通过检查程序
并由小于a h的测试覆盖ref="https://docs.pytest.org/en/latest" rel="nofollow">pytest 如果您是新会员,请阅读: 请查看以熟悉班级成员的辅助功能级别:car
类包含一个名为start_engine
的受保护成员。作为受保护的成员,无法访问它们
除非通过成员方法。只有通过名为run
的公共方法才能访问受保护的成员启动引擎
classCar{privatestringStartEngine(){// Code here.}}
2
classCar{privatestringStartEngine(){// Code here.}}
3
curl
获取包含上述代码的示例,并通过python3
运行它。
classCar{privatestringStartEngine(){// Code here.}}
4
car
类包含一个名为start_engine
的受保护成员。作为受保护的成员,可以访问它们
从子类中,在我们的例子中是tesla
。因此,重写方法run
bytesla
类可以使用父类的启动引擎成员。
classCar{privatestringStartEngine(){// Code here.}}
5
curl
获取包含上述代码的示例,并通过python3
运行它。
classCar{privatestringStartEngine(){// Code here.}}
6
其他功能
accessify
decorator从类中删除私有和受保护的成员dirclassCar{privatestringStartEngine(){// Code here.}}
7
curl
获取包含上述代码的示例,并通过python3
运行它。
classCar{privatestringStartEngine(){// Code here.}}
8
接口
单接口
humaninterface
的接口,它包含两个方法love
和eat
。另外,还有
一个类human
实现了接口,但漏掉了方法"eat",因此应该引发相应的错误。classCar{privatestringStartEngine(){// Code here.}}
9
classCar:def__start_engine(self,*args,**kwargs):pass
0
curl
获取包含上述代码的示例,并通过python3
运行它。
classCar:def__start_engine(self,*args,**kwargs):pass
1
humaninterface
的接口,它包含两个方法love
和eat
。另外,还有
一个类human
实现了接口,但遗漏了方法"eat"的4个参数中的3个,因此应该引发相应的错误。classCar:def__start_engine(self,*args,**kwargs):pass
2
classCar:def__start_engine(self,*args,**kwargs):pass
3
curl
输入上面的代码,并通过python3
运行它classCar:def__start_engine(self,*args,**kwargs):pass
4
humaninterface
的接口,它包含两个方法love
和eat
。另外,还有
一个类human
实现了接口,但错过了方法"eat"的私有访问修饰符类型,因此
应该引发错误。classCar:def__start_engine(self,*args,**kwargs):pass
5
classCar:def__start_engine(self,*args,**kwargs):pass
6
curl
获取包含上述代码的示例,并通过python3
运行它。
classCar:def__start_engine(self,*args,**kwargs):pass
7
多个接口
HumanSoulInterface
包含一个名为Love
的方法和接口HumanBasicInterface
的方法
包含名为eat
的方法。此外,还有一个类human
从第一个接口实现方法love
,但是
错过了第二个方法的"eat",因此应提出相应的错误。classCar:def__start_engine(self,*args,**kwargs):pass
8
classCar:def__start_engine(self,*args,**kwargs):pass
9
curl
获取包含上述代码的示例,并通过python3
运行它。
classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
0
异常抛出声明
humandoesnotexisterror
和exceptionhumanalreadyinloveerror
声明由
human
类方法调用了love
,但方法未能引发第二个异常,因此应引发相应的错误。classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
1
classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
2
curl
获取包含上述代码的示例,并通过python3
运行它。
classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
3
禁用检查
classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
4
贡献
classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
5
classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
6
python
version并运行测试:classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
7
classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
8
参考文献
推荐PyPI第三方库