首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

这个策略模式的python实现应该在init方法中使用私有变量吗?

策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在Python中实现策略模式时,是否在init方法中使用私有变量取决于具体的实现需求。

私有变量(以双下划线开头)在Python中用于表示类的内部实现细节,以避免与其他类或子类的命名冲突。如果策略模式的实现需要在类的内部使用私有变量来存储算法或其他内部状态,那么在init方法中使用私有变量是合理的。

然而,策略模式的核心思想是将算法封装成独立的策略类,并通过接口或基类与上下文类进行交互。在这种情况下,策略类的实例通常作为参数传递给上下文类的构造函数或其他方法,而不是在init方法中使用私有变量。

以下是一个示例,展示了策略模式的Python实现,其中没有在init方法中使用私有变量:

代码语言:txt
复制
class Context:
    def __init__(self, strategy):
        self.strategy = strategy

    def execute_strategy(self):
        self.strategy.execute()


class Strategy:
    def execute(self):
        pass


class ConcreteStrategyA(Strategy):
    def execute(self):
        print("Executing strategy A")


class ConcreteStrategyB(Strategy):
    def execute(self):
        print("Executing strategy B")


# 使用示例
strategy_a = ConcreteStrategyA()
context = Context(strategy_a)
context.execute_strategy()

在上述示例中,策略模式的实现没有使用私有变量。上下文类Context通过构造函数接收一个策略对象,并在execute_strategy方法中调用策略对象的execute方法。

需要注意的是,这只是策略模式的一种实现方式,具体的实现方式可能因项目需求而异。因此,在实际应用中,是否在init方法中使用私有变量应该根据具体情况进行决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python真的有私有化操作

这将是有争议一篇文章 Python真的有私有化操作? 这篇文章,我们将会从这样几个方面进行讲解 面向对象,总会遇到封装概念,封装就会涉及到私有概念,Python真的有私有化操作?...面向对象,也有继承概念,继承就会涉及到私有化数据是否能被继承问题,Python能继承"私有属性/私有方法"? 当然,秉持以往习惯,我们依然通过代码和原理跟大家一起分析。 1....""" 这是一个自定义模块 """ # 公开变量 info = "模块变量数据,可以被其他模块使用" # 约定规范 _message = "模块约定私有变量,仅限当前模块中使用,(约定)不允许其他模块使用...在项目开发过程,大家开始从语法层面探索私有解决方案,于是有开发团队开始使用一种新语法格式来实现私有化方案:使用双下划线字符开头变量,这样变量确实在语法上实现了不能被外界直接访问目的。...Python语法是从参考ABC语言和C语言语法语义习惯,过度过来一门高级编程语言,吸收了面向对象高级语言特性同时兼容快捷面向过程处理特征,语法已经具备了很多纯面向对象语言通过大量编码才能实现设计模式

1.1K30
  • Python下划线作用

    单前导下划线 _var是一个Python命名约定,表示这个名称是供内部使用。 它通常不由Python解释器强制执行,仅仅作为一种对程序员提示。2....单末尾下划线 var_单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突;像class或def这样名称已经被一个关键字所占用,附加一个下划线来解决命名冲突。3....双前导下划线 __varPython解释器自动在这种双下划线私有方法或者私有属性前面加上了 _类名 ,所以使用原定义变量名和方法名访问不了变量方法, 在规范上,这种双下划线私有方法私有属性是不应该在外部访问...双前导和双末尾下划线 _var_Python保留了有双前导和双末尾下划线名称,用于特殊用途。...这样例子有,__init__对象构造函数,或__call__ --- 它使得一个对象可以被调用,所以尽量不用这种表示方式,以免和python冲突。5.单下划线 _某个变量是临时或无关紧要

    63010

    初学Python语言者必须理解下划线

    Python语言中,下划线主要应用在如下5个方面: 在交互模式,保存最近一个表达式值 忽略某个值(“我不重要”) 给变量或者函数名称赋予特殊含义 作为国际化或本地化函数命名 在数字组成作为分隔符...用在交互模式Python交互模式总,如果调用_,会显示最近表达式值。这个功能在标准交互模式中都有,你也可以在其它Python交互式解析器中使用。...然而,Python并不支持真正私有化,所以我们不能强制某对象私有化,从其他模块也能直接调用它,有时候,我们会说这种私有对象是“内部使用弱指示器”。..._namne这种方式私有化,是约定私有化,不是真正私有化;__name这种方式真正实现了“私有化”,但在编程是否采用,有不同观点。或者说对于“私有化”,在Python是有不同理解。...,比如__init__, __len__。这些方法提供了一些特殊功能,比如__file__声明本地Python文件,__eq__实现了表达式a == b。

    70920

    Python私有化及_下划线命名用途

    引言 Python没有真正私有属性或方法,没有真正私有化,但有一些和命名有关约定,让编程人员处理一些需要私有情况,我们常常需要区分私有方法、属性和公有方法、属性以方便管理和调用。..._单前置下划线 前置单下划线意思是 提示 其他程序员,以单下划线开头变量方法只在内部使用。PEP 8 定义了这个约定( PEP 8 是最常用 Python 代码风格指南)。...不过,这个约定对Python解释器并没有特殊含义。与Java不同,Python在 “私有” 和 “公共” 变量之间并没有很强区别。...这是因为 Python前置单下划线只是一个公认约定,至少在涉及变量名和方法名时是这样。...使用 通配符导入 从这个模块中导入所有名称,Python 不会 导入带有前置单下划线名称(除非模块定义了__all__ 列表覆盖了这个行为。

    87900

    Python私有化及_下划线命名用途

    引言 Python没有真正私有属性或方法,没有真正私有化,但有一些和命名有关约定,让编程人员处理一些需要私有情况,我们常常需要区分私有方法、属性和公有方法、属性以方便管理和调用。..._单前置下划线 前置单下划线意思是 提示 其他程序员,以单下划线开头变量方法只在内部使用。PEP 8 定义了这个约定( PEP 8 是最常用 Python 代码风格指南)。...不过,这个约定对Python解释器并没有特殊含义。与Java不同,Python在 “私有” 和 “公共” 变量之间并没有很强区别。...这是因为 Python前置单下划线只是一个公认约定,至少在涉及变量名和方法名时是这样。...使用 通配符导入 从这个模块中导入所有名称,Python 不会 导入带有前置单下划线名称(除非模块定义了__all__ 列表覆盖了这个行为。

    58610

    基础知识|初入Python语法和注释(三)

    Python一些简单知识,作为了解,这里再增加一个章节来描述一下Python在实际开发过程一些语法、怎么注释和一些变量使用。...这是一个很好问题,因为我们在Java中知道,这个没有限制,除了针对代码可读性来说,好像也没有什么特殊。那么这个Python呢?我们可以从代码上看下。...Python 实现对代码缩进,可以使用空格或者 Tab 键实现。...但应该在它们后面加(除非在行尾) 函数参数列表,逗号之后要有空格 函数参数列表,默认值等号两边不要添加空格 左括号之后,右括号之前不要加添加空格 参数列表, 索引或切片左括号前不应加空格 当'...大小写混合仅在为了兼容原来主要以大小写混合风格情况下使用,保持向后兼容。 私有函数在函数前加一个下划线_。 始终要将self作为实例方法第一个参数。 始终要将cls作为类方法第一个参数。

    15910

    Python学习入门基础 — 第七章 面向对象三大特性、单例设计模式

    第二章 注释、变量基本使用变量命名 第三章 运算符、判断if语句、while和for循环 第四章 列表、元组、字典、字符串变量使用变量进阶 第五章 函数基础、函数进阶 第六章 面向对象基础...属性 和 方法 提问 哮天犬 能够调用 Cat 类定义 catch 方法?...重写 父类方法有两种情况: 覆盖 父类方法 对父类方法进行 扩展 1) 覆盖父类方法 如果在开发,父类方法实现 和 子类方法实现,完全不同 就可以使用 覆盖 方式,在子类 重新编写 父类方法实现...子类方法实现 包含 父类方法实现 父类原本封装方法实现 是 子类方法一部分 就可以使用 扩展 方式 在子类 重写 父类方法 在需要位置使用 super().父类方法 来调用父类方法执行...代码其他位置针对子类需求,编写 子类特有的代码实现 关于 super 在 Python super 是一个 特殊类 super() 就是使用 super 类创建出来对象 最常 使用场景就是在

    38320

    Python基础教程(三)

    域有两种类型 属于实例 属于类本身 它们分别被称为实例变量和类变量。 类使用关键字class创建,类域和方法被列在一个缩进块。...类方法必须有一个额外第一个参数,但是在调用时不为这个参数赋值,这个特殊变量指对象本身,按照惯例它名称是self,类似Javathis。...在类中下面两个特都方法需要注意: __init__方法:在类一个对象被创建时调用该方法;相当于c++构造函数,就是当这个类调用了,那么这个__init__ 方法就要执行。...但是Python却有私有变量私有方法之说,这个是一个例外,如果使用数据成员以双下划线为前缀,则为私有变量。 你实例化这个类,访问不了。...儿子试试super()拿你私房钱,但是这里需要注意super()强制调用父类私有属性方法,就是重写方法私有变量是不能用supper继承不了,还不可以访问父类私有属性方法变量,就是儿子是拿不了私房钱

    38620

    一日一技:在Python双下划线私有方法不能被调用原理

    使用Python编写面向对象代码时,我们会常常使用“继承”这种开发方式。...__init__() def calc_age(self): print(123456) 如果你使用 PeopleInfo初始化一个对象,然后调用这个 calc_age方法,我们来看看运行效果,...而且这些以双下划线开头私有方法或者属性,在类内部可以自由被其他方法调用,但是在实例对象里面是不能直接调用,如下图所示: 那么Python是如何实现这一点呢?...Python仅仅是改了一个名字,在这种双下划线私有方法或者私有属性前面加上了 _类名,这样就确保了子类和父类方法名不一致。...所以,虽然 在规范上,这种双下划线私有方法私有属性是不应该在外部访问,但是如果你想强行访问,可以个使用这种改名以后名字: kingname = PeopleInfo() kingname.

    1.6K30

    Python后端技术栈(三)--设计模式

    同时类具有一个方法,可以输出姓名。 注意:在类属性前加单下划线表示私有属性,不希望外界进行访问。在类两个下划线表示是魔法方法。...3.静态方法不需要额外定义参数,因此在静态方法引用类属性的话,必须通过类实例对象来引用 1.3.1.6什么是元类?使用场景?...LowercaseClass().hello() 类 __new__用来生成实例, __init__初始化实例 1.3.2 Python 装饰器 如果想给一个类扩充功能,可以使用组合和继承。...之所以动态语言比如 Python 里面设计模式少,并不是说它不重要,而是动态语言自己已经实现了一些设计模式,比如迭代器模式,装饰器模式 Python 本身就支持。...):针对不同规模输入使用不同策略 1.3.5.2迭代器模式 1.Python 内置对迭代器模式支持 2.比如我们可以用 for 遍历各种 Iterable 数据类型 3.Python 里可以实现

    1.1K30

    Python 基础(十一):面向对象

    1 简介 面向对象(OOP)是一种对现实世界理解和抽象方法,对象含义是指在现实生活能够看得见摸得着具体事物,一句比较经典描述是一切皆对象,Python 是一门面向对象语言,面向对象编程简单来说就是一种封装代码方式...面向对象相关概念 类:描述具有相同属性和方法集合,简单来说就是一个模板,通它来创建对象。 对象:类实例。 方法:类定义函数。 类变量:定义在类且在函数之外变量,在所有实例化对象公用。...局部变量方法定义变量,只作用于当前实例。 面向对象三大特性 封装:隐藏对象属性和实现细节,仅对外提供公共访问方式,提高复用性和安全性。...2 基本操作 2.1 类 Python 定义使用 class 关键字,语法如下所示: class 类名: 属性 ... 方法 ......__run,那我们会有这样一个疑问,这个私有属性和方法难道定义了却不能用

    29520

    Python属性

    Python私有属性和方法? 我们在Python方法和属性上下文中使用这两个术语,公共和私有。 当属性是私有的时,你不应该使用它;当方法私有的时,你不应该调用它。...你可能已经注意到我用了“应该”这个词。这是因为,正如我已经提到Python情况有所不同:当某事是公共时,你可以访问和使用它;当它是私有的时,你不应该这样做——但这并不意味着你不能。...这样做,你表明,建议或推荐该方法/属性应该被视为私有的,意味着它不应该在外部使用。 因此,instance.do_it() 是一个常规(公共)方法,而 instance....但是当你知道自己在做什么,当你目的要求你使用私有属性时,Python可以实现这一点。这为Python开发者提供了许多额外机会。 使用私有方法或属性有点像在淋浴时监视我,你可以看到我想隐藏东西。...要使用名称修饰,你只需要记住这个命名规则:不要使用.name()约定来命名私有方法,因为这样不起作用。 结论 我们讨论了在Python面向对象编程上下文中隐私概念。

    17730

    Python 【面向对象】

    方法:类定义函数。 类变量:类变量在整个实例化对象是公用。类变量定义在类且在函数体之外。类变量通常不作为实例变量使用。 数据成员:类变量或者实例变量用于处理类及其实例对象相关数据。...方法重写:如果从父类继承方法不能满足子类需求,可以对其进行改写,这个过程叫方法覆盖(override),也称为方法重写。 局部变量:定义在方法变量,只作用于当前实例类。...和继承很相似,可以让在一个类中使用另一个类方法,但是并不是父类和子类继承关系 他是先实例化一个类实例,然后将这个实例当做参数传入列一个类,所以就可以在这个调用了 组合举例说明 如何实现...在面向对象单例模式就是一个类只有一个对象,所有的操作都通过这个对象来完成,这就是面向对象单例模式,下面是实现代码: class Foo: # 单例模式 __v=None @classmethod...能够节省资源,就比如在数据库连接池时候就可以使用单例模式,只创建一个类对象供其他程序调用,还有在web服务接收请求也可以使用单例模式实现,节省资源。

    1.6K30

    JavaScript组件设计思想

    紧跟着,这个周期盼已久“重构版热图”上线了,“低bug率、高速度”等在各方面指标瞬间秒杀“旧版热图”,让大家眼前一亮。随即,我们组织了分享讨论会,让匡哥讲述其重构过程设计思路。...大致思想如下:将每个功能点最小颗粒化、然后将其封装成模块;创建数据中心,使各个模块不在互相调用嵌套,所有的依赖和调用全部通过数据中心(这里使用自定义事件实现观察者模式);所有的网状需求点,划点成线,...这不就是“分层思想”一种体现?我陷入了沉思~~~ 现在,大前端流行组件化、模块化。然而,我们模块又该如何设计实现呢?...使用变量模拟单个命名空间,统一入口调用方法 var textCount = { input: null, init: function(config) { this.input...this.template) return; //使用_parseTemplate解析渲染模板生成html //子类可以覆盖这个方法使用其他模板引擎解析

    81951

    Python 快速入门》一千个程序员有一千套编码规范

    包/模块名连字符(-) 双下划线开头并结尾名称(Python保留, 例如__init__) 命名约定 所谓"内部(Internal)"表示仅模块内可用, 或者, 在类内是保护或私有的....用单下划线(_)开头表示模块变量或函数是protected(使用import * from时不会包含). 用双下划线(__)开头实例变量方法表示类内私有....Python会将 圆括号, 括号和花括号行隐式连接起来 , 你可以利用这个特点. 如果需要, 你可以在表达式外围增加一对额外圆括号。...方法定义, 类定义与第一个方法之间, 都应该空一行. 函数或方法, 某些地方要是你觉得合适, 就空一行. ---- 6、空格 按照标准排版规范来使用标点两边空格 括号内不要有空格....不要用_连接 受保护实例属性,应以单下划线开头 实例私有属性,应以双下划线开头 模块级别的变量单词都要大写,中间以单下划线隔开 变量要尽可能有意义 2.空白 和语法相关每一层缩进都用4个空格表示

    54510

    Python】 面向对象编程(OOP)之封装艺术

    如上为 python 类设计结构语法: 类函数称为方法方法第一个参数须是 self 关键字。 __init__ 方法是必须,其方法名不得修改。...所以需要传递小狗具体姓名和年龄初始 name 和 age 变量。 调用类方法时,不需要为方法声明时 self 参数传递值。 有了对象后,如需要使用此对象数据时,可使用 . 运算符。...封装优点! 当我们通过对象使用数据和方法时,不需要了解其中内部细节,如此实现了设计和使用分离,和现实世界我们使用手机一样,不需了解手机内部结构和细节。...开发者在使用 python 提供模块时,不需要了解模块相关实现细节,直接使用其功能便可。 设计和使用分离能加速工业软件开发效率。...我们应该在设计类时候提供一种内部安全检查机制,保护变量能被赋予一个正确、可靠值。 实施流程: 1. 在变量方法前面加上双下划线(__)让变量成为私有概念 python 语法有很大弹性。

    37820

    python面向对象编程指南 pdf_python面向对象三个基本特征

    利用这个方法和类属性特性可以实现设计模式单例模式。单例模式是指创建唯一对象,单例模式设计类只能实例化一个对象。...不允许实例化类访问私有数据,但你可以使用object....先来谈一下类属性和实例属性   在前面的例子我们接触到就是类属性,顾名思义,类属性就是类对象所拥有的属性,它被所有类对象实例对象所共有,在内存只存在一个副本,这个和C++静态成员变量有点类似...Python多态和Java以及C++多态有点不同,Python变量是弱类型,在定义时不用指明其类型,它会根据需要在运行时确定变量类型(个人觉得这也是多态一种体现),并且Python本身是一种解释性语言...在C++, Java, C#实现多态方式通常有重写和重载两种,从上面两段代码,我们其实可以分析得出Python实现多态也可以变相理解为重写和重载。

    73821

    Python面向对象小白入门手把手级别教程

    前言Python面向对象编程(OOP)是一种编程范式,它使用对象和类概念来组织代码。这种方法强调了数据封装、继承和多态性,从而使代码更加模块化、灵活和可重用。...在Python私有成员是使用两个_来表示私有成员函数,例如:def __私有函数: ...共有函数则是不带_号:def 共有函数: ...实例:class Tencent: def...Python数据成员是可以动态添加这个特点是Python动态类型一种比较好体现。...在Python可以大概分为四种:公有方法私有方法、类方法、静态方法。公有方法这些是在类中最常见方法类型。可以被类实例以及如果被其他类继承,也可以被子类实例访问。...__private_attribute = "这是一个私有属性" 受保护属性:以单个下划线_开头属性被视为受保护。这是一种约定,用于指示属性不应该在外部使用,尽管实际上它们可以被访问。

    45220
    领券