参数过多的类:更好的设计策略?

2024-05-10

我正在研究神经元模型。我正在设计的一个类是细胞类,它是神经元(几个连接在一起的隔室)的拓扑描述。它有很多参数,但它们都是相关的,例如:

轴突段数、顶端二纤化、体细胞长度、体细胞直径、顶端长度、分支随机性、分支长度等等等等......总共大约有15个参数!

我可以将所有这些设置为某个默认值,但我的类看起来很疯狂,有几行参数。这种事情也一定会偶尔发生在其他人身上,是否有一些明显更好的方法来设计这个或者我做的是正确的事情吗?

UPDATE:正如你们中的一些人所问的,我已经附上了该类的代码,正如您所看到的,该类有大量参数(> 15),但它们都被使用并且是定义单元拓扑所必需的。问题本质上是他们创建的物理对象非常复杂。我附上了该类生成的对象的图像表示。经验丰富的程序员会如何以不同的方式执行此操作以避免定义中出现如此多的参数?

class LayerV(__Cell):

    def __init__(self,somatic_dendrites=10,oblique_dendrites=10,
                somatic_bifibs=3,apical_bifibs=10,oblique_bifibs=3,
                L_sigma=0.0,apical_branch_prob=1.0,
                somatic_branch_prob=1.0,oblique_branch_prob=1.0,
                soma_L=30,soma_d=25,axon_segs=5,myelin_L=100,
                apical_sec1_L=200,oblique_sec1_L=40,somadend_sec1_L=60,
                ldecf=0.98):

        import random
        import math

        #make main the regions:
        axon=Axon(n_axon_seg=axon_segs)

        soma=Soma(diam=soma_d,length=soma_L)

        main_apical_dendrite=DendriticTree(bifibs=
                apical_bifibs,first_sec_L=apical_sec1_L,
                L_sigma=L_sigma,L_decrease_factor=ldecf,
                first_sec_d=9,branch_prob=apical_branch_prob)

        #make the somatic denrites

        somatic_dends=self.dendrite_list(num_dends=somatic_dendrites,
                       bifibs=somatic_bifibs,first_sec_L=somadend_sec1_L,
                       first_sec_d=1.5,L_sigma=L_sigma,
                       branch_prob=somatic_branch_prob,L_decrease_factor=ldecf)

        #make oblique dendrites:

        oblique_dends=self.dendrite_list(num_dends=oblique_dendrites,
                       bifibs=oblique_bifibs,first_sec_L=oblique_sec1_L,
                       first_sec_d=1.5,L_sigma=L_sigma,
                       branch_prob=oblique_branch_prob,L_decrease_factor=ldecf)

        #connect axon to soma:
        axon_section=axon.get_connecting_section()
        self.soma_body=soma.body
        soma.connect(axon_section,region_end=1)

        #connect apical dendrite to soma:
        apical_dendrite_firstsec=main_apical_dendrite.get_connecting_section()
        soma.connect(apical_dendrite_firstsec,region_end=0)

        #connect oblique dendrites to apical first section:
        for dendrite in oblique_dends:
            apical_location=math.exp(-5*random.random()) #for now connecting randomly but need to do this on some linspace
            apsec=dendrite.get_connecting_section()
            apsec.connect(apical_dendrite_firstsec,apical_location,0)

        #connect dendrites to soma:
        for dend in somatic_dends:
            dendsec=dend.get_connecting_section()
            soma.connect(dendsec,region_end=random.random()) #for now connecting randomly but need to do this on some linspace

        #assign public sections
        self.axon_iseg=axon.iseg
        self.axon_hill=axon.hill
        self.axon_nodes=axon.nodes
        self.axon_myelin=axon.myelin
        self.axon_sections=[axon.hill]+[axon.iseg]+axon.nodes+axon.myelin
        self.soma_sections=[soma.body]
        self.apical_dendrites=main_apical_dendrite.all_sections+self.seclist(oblique_dends)
        self.somatic_dendrites=self.seclist(somatic_dends)
        self.dendrites=self.apical_dendrites+self.somatic_dendrites
        self.all_sections=self.axon_sections+[self.soma_sections]+self.dendrites

UPDATE:这种方法可能适合您的具体情况,但它肯定有其缺点,请参阅kwargs 是反模式吗? https://softwareengineering.stackexchange.com/questions/294320/is-kwargs-an-antipattern

尝试这个方法:

class Neuron(object):

    def __init__(self, **kwargs):
        prop_defaults = {
            "num_axon_segments": 0, 
            "apical_bifibrications": "fancy default",
            ...
        }
        
        for (prop, default) in prop_defaults.iteritems():
            setattr(self, prop, kwargs.get(prop, default))

然后您可以创建一个Neuron像这样:

n = Neuron(apical_bifibrications="special value")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

参数过多的类:更好的设计策略? 的相关文章

随机推荐

  • 方法调用 mActionBar=getActionBar() 给出错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用支持库android support v7 app actionbar因为我想要操作栏API 级别 8以上 但是下面的句子给了我
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • static 和 volatile 关键字的顺序重要吗?

    volatile static int i and static volatile int i 两者有什么区别 编译器如何看待这一点 顺序无关紧要 static是存储时间 6 2 4 对象的存储时长 3 一个标识符为的对象 用外部或内部声明
  • 如何让 mysql 输出 DateTime 到儒略日数?

    基本上我正在使用用于 Ruby 的 MySQL gem http www tmtm org en mysql ruby 并且我对日期比较没有合理的支持 这Mysql Time类只为我提供了访问器方法 如年 月 秒等 如果我可以将其转换为 R
  • 对于“迭代算法”,转换为 RDD 然后再转换回 Dataframe 有什么优势

    我在读高性能火花作者提出以下主张 虽然 Catalyst 优化器非常强大 但它目前遇到挑战的情况之一是非常大的查询计划 这些查询计划往往是迭代算法的结果 例如图算法或机器学习算法 一个简单的解决方法是将数据转换为 RDD 并在每次迭代结束时
  • 回显 HTML 并内置 PHP

    请帮助我使用 echo 与 HTML 和 PHP 使用数组范围将其转换为动态
  • 将 Pi 转换为字母?

    对于 Pi Day 我正在尝试编写一个 Java 程序 尝试在 Pi 中找到给定的单词 或另一个给定的无理数 我几乎已经完成了所有工作 但我对如何将 pi 的每个数字转换为字母感到矛盾 我想说 A 01 B 02 C 03 Y 25 Z 2
  • 在 PHP $_SESSION 中存储数据不安全吗?

    根据我的理解 PHP 进程的行为并不像应用程序服务器进程 因此 执行脚本后 PHP 进程不会保留任何用户特定数据 相反 它将它们存储在用户的 cookie 中 所以无论我们存储在什么地方 SESSSION进入cookie 这是真的 如果是
  • Cordova 插件包括 Android 库 (Gradle)

    我想包括这个 Androidlibrary https github com 50ButtonsEach fliclib android在 Cordova 插件中 该库本身由 Gradle 管理 如 Github 链接所示 图书馆的开发者只
  • DS-5:什么是 FVP、RTSM、基础模型、AEM 模型、快速模型、CADI?

    DS 5 模拟器使用了很多术语 如 FVP RTSM 快速模型 基础模型 AEM 模型 CADI Arm的文档中提供的解释不是很清楚 这些术语的含义是什么 作为 DS 5 的最终用户我应该关心哪些术语 Model 软件模拟的行业术语 就 A
  • 使用 plyr daply 将数据帧转换为矩阵

    我正在尝试使用daply函数在plyr包 但我无法让它正确输出 尽管组成矩阵的变量是数字 但矩阵的元素是列表 而不是变量本身 例如 以下是一小部分数据 Month Vehicle Samples 1 Oct 10 31057 256 2 O
  • 如何将数据插入 Microsoft Access 数据库?

    我正在尝试将数据插入 Microsoft Access 数据库 我将数据插入到 Access 数据库中 但只有第一次和第二次显示我插入的数据 当我重建应用程序时 我插入的数据消失了 我不知道他们去了哪里并且没有出现 我使用 C 和 NET
  • 如何阅读shell命令的源代码?

    我想阅读编写linux命令的实际源代码 我已经获得了一些使用它们的经验 现在我认为是时候与我的机器进行更深层次的交互了 我在这里找到了一些命令http directory fsf org wiki GNU http directory fs
  • 如何在调试模式下更改灯开关应用程序的连接字符串

    请问我如何更改灯开关应用程序的连接字符串以进行调试 我已经关注了这个帖子http dougseven com 2010 08 23 data storage in visual studio lightswitch 2 http dougs
  • 当子可滚动部件到达颤振顶部时,如何自动开始滚动父可滚动部件

    这似乎很自然 甚至可能是预料之中的 但我仍然没有找到任何可能有帮助的东西 我在另一个可滚动小部件 父级 中有一个 ScrollablePositionedList 几乎与 ListView 相同 我尝试过 CustomScrollView
  • 基于不同 ID 的 SSAS 聚合

    我希望将不同 ID 值的默认聚合从 SUM 更改为 SUM 这是当前的行为 ID Amount 1 10 1 10 2 20 3 30 3 30 Sum Total 90 默认情况下 我会收到 90 美元 我希望对不同的 id 进行求和并得
  • 传入字符串作为参数,而不将其视为原始字符串

    我想将一个字符串传递给我的 python 脚本 其中包含转义序列 例如 x00 or t和空格 但是 当我将字符串传递为 some string x00 more tstring python 将我的字符串视为原始字符串 当我从脚本内部打印
  • 使用 CSS 格式化日期/时间或百分比值?

    有没有办法使用 CSS 来使用特定格式格式化日期 例如YYYY MM DD 或 MM DD YYYY 有或没有时间 也可以将数字格式化为保留 2 位小数的百分比值 例如5 4321987 显示为 5 43 我可能可以使用 JavaScrip
  • application.css 未作为资产提供

    编辑4 5和6 8小时后 欢迎任何更多的想法 也许这个错误已经被知道并解决了 但是当你在 app assets stylesheets 的 css erb 文件中有这个时 我得到了我在编辑 2 3 中描述的行为 li background
  • 参数过多的类:更好的设计策略?

    我正在研究神经元模型 我正在设计的一个类是细胞类 它是神经元 几个连接在一起的隔室 的拓扑描述 它有很多参数 但它们都是相关的 例如 轴突段数 顶端二纤化 体细胞长度 体细胞直径 顶端长度 分支随机性 分支长度等等等等 总共大约有15个参数