python – 在对象实例化中选择几种方法之一
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 在对象实例化中选择几种方法之一,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3346字,纯文字阅读大概需要5分钟。
内容图文
![python – 在对象实例化中选择几种方法之一](/upload/InfoBanner/zyjiaocheng/729/86b4492ad16946efa8a155ea8b9001b0.jpg)
我有一个python类,我们称之为MyClass,有几个绑定方法.我需要这些方法之一的行为,称之为.dynamic_method(),根据对象创建过程中参数集的值而大不相同. dynamic_method会有一些变体,它们之间会共享非常少的代码,因此将它们定义为单独的函数/方法而不是具有许多选项和条件的单个大型方法是有意义的.我不需要在创建对象后更改此方法的行为,可以在__init __()期间设置所有内容.
作为参考,MyClass管理数据集,而.dynamic_method处理此数据的某些IO方面,这些方面根据数据集和上下文而变化.
这在技术上并不难实现,但我提出的方法都没有完全正确:
>将方法变体分别定义为函数,并使用下面描述的方法之一在__init __()中将其中一个作为绑定方法附加:Adding a Method to an Existing Object Instance.这对我来说似乎是最自然的选择,但该线程中的许多答案强烈反对使用这种模式.
>将类定义中的所有可能方法定义为.dynamic_method_a,.dynamic_method_b等,并设置选项/别名,以便MyClass.dynamic_method()调用正确的方法.这将导致非常长的类定义,以及每个对象的许多未使用的方法.
>将方法存储为单独的函数,并且.dynamic_method()只需使用self作为第一个参数调用正确的函数.这感觉就像故意滥用方法的概念,并将打破linting.
>使用工厂模式或对象生成器功能.我宁愿避免这种情况,因为它会增加代码库最复杂的程度.
什么被认为是实现这种行为的最“Pythonic”方式?上面提到的方法之一,还是有一个我错过的明显替代方案?
解决方法:
我建议工厂,确实增加了复杂性,但让我指出一些优点.
>灵活应对未来的变化
>在阅读代码时,通过它的类更容易理解对象所期望的行为类型
>如果您使用带有类型提示(pycharm或其他)的IDE,您的编码将更容易,因为IDE可以在运行时了解对象将使用的方法
代码示例:
class DataStruct:
def __init__(self, input_: str):
self.Field = input_
class MyClass:
def __init__(self, data: DataStruct):
self.Data: DataStruct = data
def dynamic_method(self):
# Abstract Method
pass
def __str__(self):
return self.Data.Field
class MyClassFunctionalityOne(MyClass):
def __init__(self, data: DataStruct):
super().__init__(data)
def dynamic_method(self):
self.Data.Field = self.Data.Field.upper()
class MyClassFunctionalityTwo(MyClass):
def __init__(self, data: DataStruct):
super().__init__(data)
def dynamic_method(self):
self.Data.Field = "and now for something completely different"
class MyClassFactory:
def __init__(self):
pass
@classmethod
def manufacture(cls, input_: DataStruct) -> MyClass:
#replace this if..elif chain to contain the tests on the data you need for determine the right method
if input_.Field.count('one') > 0:
obj: MyClass = MyClassFunctionalityOne(input_)
elif input_.Field.count('two')> 0:
obj: MyClass = MyClassFunctionalityTwo(input_)
else:
obj = None
return obj
# script starts here
received_data = DataStruct('This kind of data should result in functionality one')
object1 = MyClassFactory.manufacture(received_data)
received_data = DataStruct('This kind of data should result in functionality two')
object2 = MyClassFactory.manufacture(received_data)
print (type(object1))
print (type(object2))
print ('*'*5, 'objects before dynamic_method', '*'*5)
print (object1)
print (object2)
object1.dynamic_method()
object2.dynamic_method()
print ('*'*5, 'objects after dynamic_method', '*'*5)
print (object1)
print (object2)
输出:
<class '__main__.MyClassFunctionalityOne'>
<class '__main__.MyClassFunctionalityTwo'>
***** objects before dynamic_method *****
This kind of data should result in functionality one
This kind of data should result in functionality two
***** objects after dynamic_method *****
THIS KIND OF DATA SHOULD RESULT IN FUNCTIONALITY ONE
and now for something completely different
内容总结
以上是互联网集市为您收集整理的python – 在对象实例化中选择几种方法之一全部内容,希望文章能够帮你解决python – 在对象实例化中选择几种方法之一所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。