淘优惠

淘优惠

可爱的 Python: Python 之优雅与瑕疵,第 2 部分 z

热门文章 0

在这篇 分两部分的系列文章 中,David 讨论了添加到最近几个 Python 版本中的一些不那么引人注目的特性和不恰当特性,目的是向业余 Python 编程人员揭示 Python 优点的同时使他们能够避免错误。本期文章将讨论的内容包括属性和方法、描述符和特性。

本系列 第一期文章 讨论了序列和比较。本期文章将以这些主题为基础展开讨论。

在大多数面向对象语言中,方法和属性几乎相同(但并非完全相同)。两者都可以附加到类和/或实例。除了实现细节外,存在一个关键区别:当附加到对象时,您可以调用 方法 发起动作和计算;而属性 仅具有一些可被检索(或者修改)的值。

对 于某些语言(例如 Java? 语言),这可能是惟一的区别。属性和方法之间泾渭分明。Java 语言通常主要关注封装和数据隐藏;因此鼓励使用 “setters” 和 “getters” 方法访问其他私有的属性数据。对于 Java 式的思考方式,如果您希望向数据访问和修改中添加计算功能和副作用,则需要提前使用显式的方法调用。当然,Java 方法生成的结果比较冗长,并且某些时候必须遵守一些人为规定的规则:编写 (而不是 )和 (而不是 )。

作为这方面的一种独特技术,有必要提到 Ruby。实际上,Ruby 在数据隐藏方面要求比 Java 更严格:所有 属性始终 是 “私有的”;您决不能 直接访问实例数据。同时,Ruby 使用了某些语法约定,使方法调用类似于其他语言中的属性访问。第一个约定是在方法调用中使用 Ruby 的圆括号(可选);第二个约定就是使用半专有的方法命名,其中使用了在其他语言中作为运算符的符号。因此在 Ruby 中, 仅仅是调用 的一种更简短方法;而 “设置” 则是 的一种简略形式。实际上,所有内容 都涉及到方法调用。

Python 要比 Java 或 Ruby 更加灵活,这个优点既值得称道,同时也为人们所诟病。如果您在 Python 中访问 ,或设置 , 您可能使用了一个简单的数据值,或者调用了某些半隐藏的代码。此外,在后者中,至少有六种不同方法可以访问代码块,各种方法之间稍有不同,这些细微差别极 易混淆。过多的方法损害了 Python 的正则性,使非专家人员(甚至专家)难于理解。我知道为什么这些方法都自成体系:因为新的功能是分步添加到 Python 的面向对象基础中的。但是我并不觉得这种混乱有什么值得高兴的。

一种老式方法

在过去(Python 2.1 以前),Python 具有一个神奇的方法,称为 ,类可以定义该方法以返回经过计算的值,而不仅仅是简单的数据访问。同样神奇的 和 方法可以在设置或删除 “属性” 时使代码运行。这种旧式机制的问题是,您从来没有真正了解代码是否确实将被调用,因为这取决于属性是否具有与 中访问过的属性相同的名称。您可以尝试创建控制 最终状态的 和 方法,但即使这样也不能防止其他代码对 的直接操作。不管在处理对象时是否实际运行了方法,修改继承树和将对象传递给外部函数经常会使这一点变得不那么明显。例如:

清单 1. 是否将运行方法?
>>> class Foo(object):...     def __getattr__(self, name):...         return "Value of %s" % name>>> foo = Foo()>>> foo.just_this = "Some value">>> foo.just_this'Some value'>>> foo.something_else'Value of something_else'

对 的访问跳过了方法代码,而对 的访问则运行了代码;除了这个 shell 会话较短以外,没什么特别明显的不同。事实上,是否运行了 ,答案很让人容易误解:

清单 2. hasattr() 使用的多义性
>>> hasattr(foo,'never_mentioned')True>>> foo2.__dict__.has_key('never_mentioned')  # this worksFalse>>> foo2.__dict__.has_key('just_this')True
回页首

slot 方法

使用 Python 2.2,我们获得了一种创建 “限制” 类的新机制。新式类 属性的具体用途并不十分明了。大部分情况下,Python 文档建议只有对具有大量实例的类进行性能优化时使用 ―― 但这绝不是 一种声明属性的方法。但是,后者正是 slot 的作用:它们将创建一个不具备 属性的类,其中的属性都经过显式命名(然而,在类主体内仍按常规声明方法)。这有一点特别,但是这种方法可以确保在访问属性时调用方法代码:

清单 3. 确保方法执行使用 .__slots__
>>> class Foo2(object):...     __slots__ = ('just_this')...     def __getattr__(self, name):...         return "Value of %s" % name>>> foo2 = Foo2()>>> foo2.just_this = "I'm slotted">>> foo2.just_this"I'm slotted">>> foo2.something_else = "I'm not slotted"AttributeError: 'Foo' object has no attribute 'something_else'>>> foo2.something_else'Value of something_else'

声明 可确保只能直接访问您指定的那些属性;所有属性都将经过 调用。如果您还创建了一个 方法,您可以指定执行一些其他工作,而不是引发一个 (但要确保在指定中使用经过 “slot” 处理的值)。例如:

清单 4. 结合使用 .__setattr__ 和 .__slots__
>>> class Foo3(object):...     __slots__ = ('x')...     def __setattr__(self, name, val):...         if name in Foo.__slots__:...             object.__setattr__(self, name, val)...     def __getattr__(self, name):...         return "Value of %s" % name...>>> foo3 = Foo3()>>> foo3.x'Value of x'>>> foo3.x = 'x'>>> foo3.x'x'>>> foo3.y'Value of y'>>> foo3.y = 'y'   # Doesn't do anything, but doesn't raise exception>>> foo3.y'Value of y'
回页首

方法

在 Python 2.2 及之后版本中,您可以选择使用 方法,代替具有类似名称且易被混淆的老式 方法。如果使用的是新式的类(一般情况下总是如此),您就可以这样做。 方法比它的同类方法更为强大,因为不管属性是不是在 或 中定义的,它将拦截所有 属性访问。使用 方法的一个缺点是,所有访问都需通过该方法。如果您使用这种方法,并希望返回(或操作)属性的 “real” 值,则需要进行少量特殊的编程:通常可通过对超类(一般为 )调用 实现。例如:

清单 5. 返回一个 “real” .__getattribute__ value
>>> class Foo4(object):...     def __getattribute__(self, name):...         try:...             return object.__getattribute__(self, name)...         except:...             return "Value of %s" % name...>>> foo4 = Foo4()>>> foo4.x = 'x'>>> foo4.x'x'>>> foo4.y'Value of y'

在 Python 的所有版本中, 和 还拦截了所有对属性的写入和删除访问,而不仅仅是 缺少的那些访问。

回页首

描述符

通过枚举的方式,我们逐一介绍了如何使属性的行为类似于方法。通过使用这些方法,您可以检查被访问、赋值或删除的特定属性名。事实上,如果愿意的话,可以 通过正则表达式或其他计算检查这些属性名。理论上讲,您可以制定任何类型的运行时决策,确定如何处理某些给定的伪属性。例如,假设您并不想对属性名和字符 串模式进行比较,而只是想查明具有该属性名的属性是否一直保存在持久性数据库中。

然而,很多时候,您仅希望以某种特殊的方式使用少数属性,而其他属性则按照普通属性操作。这些普通属性不会触发任何特殊代码,也不会因为遍历方法代码而浪费时间。在这些情况下,您可以对属性使用描述符。或者,定义与描述符密切关联的特性(property)。实际上,特性和描述符基本是同一类东西,但是定义语法却截然不同。并且由于定义类型存在差别,正如您所料,特性和描述符各有优缺点。

让我们首先查看描述符。其原理就是将某种特殊类型的类的实例指派给另一个类的属性。这个特殊的 “描述符” 类是一种新式类,包含的方法有 、 和 (或者至少包含其中的几种)。如果描述符类至少实现了前两个方法,则被称为 “数据描述符”;如果只实现了第一个方法,则被称为 “非数据描述符”。

非数据描述符最常用于返回一个可调用对象。某种意义上讲,非数据描述符通常是某种方法的一个好听的名字 ―― 但是可以在运行时确定描述符访问所返回的特定方法。它将首先处理类似元类和修饰器等最棘手的内容,我在之前的文章中讨论过这些内容(参考 参考资料 中的链接)。当然,普通的方法也可以根据运行时条件确定要运行哪些代码,因此,关于在运行时确定 “方法” 处理的概念不存在什么特别新的内容。

无论如何,数据描述符更为常见,因此我将向您展示一个例子。这种描述符可以 返回可调用的内容 ―― 毕竟 Python 函数或方法可以返回任何内容。但此处的示例仅处理简单的值(和副作用)。我们希望利用一些属性将动作记录到 STDERR:

清单 6. 数据描述符示例
>>> class ErrWriter(object):...     def __get__(self, obj, type=None):...         print >> sys.stderr, "get", self, obj, type...         return self.data...     def __set__(self, obj, value):...         print >> sys.stderr, "set", self, obj, value...         self.data = value...     def __delete__(self, obj):...         print >> sys.stderr, &#

嗨师兄生活小助手


一、chatGTP官网网址

chatGTP官网:https://openai.com/

二、chatGTP是什么?

        ChatGPT 是OpenAI 于去年11月发布的 AI 聊天机器人系统,用于展示和测试一个非常庞大、强大的 AI 系统可以完成的任务。您可以向它提出无数问题,而且通常会得到有用的答案。感觉有点要渐渐取代创新价值不高的一些职位。发布2个月,ChatGPT用户突破1亿。它是一个超级对话模型,目前,ChatGPT处于测试阶段,只要有 OpenAI 账户就可以免费使用。可以帮你写代码,做数学题,做菜谱,学英文,翻译外语,写文章...

三、chatGTP注册流程

1、目前除了国内和香港IP不能登录,其他IP才可以打开。

2、需要用一个国外手机号注册;

3、用Chrome或edge等浏览器打开。

1、注册:

        打开接码平台https://sms-activate.org/,右上角注册,按提示完成。

2、注册ChatGPT

        用浏览器打开网址,不能是香港IP,打开openai官网注册:https://beta.openai.com/signup,可使用任何邮箱,注册后有个邮箱验证,按提示完成即可,一直到验证手机号这一步。

        然后回到上面准备阶段的最后一步,购买手机号,购买完把号码复制过去进行验证,点击send code,然后回到接码平台,看等待短信那里是否出现数字验证码,没有就刷新一下,拿到验证码之后复制过去验证,到此就成功了。注意,印度的区号是91,不要搞错。

3、接入体验脚本到wx

        最有意思的就是这步啦,把ChatGPT接入使用,下面分享一个接入个人wx的脚本,可以自动回信息,也可以当成浏览器来使用,或者写文案......有问有答哈哈哈。

        ①下载脚本:https://pan.baidu.com/s/12xMaI6c1eq5IXxcEsQt6MA 、提取码:vtap

        ②解压之后按下图操作,三步:

          a、openai官网获取key;

          b、复制key修改脚本文件;

          c、打开脚本,按提示登录微信网页版。

至此,ChatGPT就成功接入啦,快去体验吧。


团队管理经验心得


在企业里,常见的系统组织包括管理体系(公司高管、各种委员会等)、技术体系(产品、研发、测试、技术支持、售前等)、营销体系(销售事业部、营销支持部、品牌推广部等)、制造物流体系(制造部、供应链、物流运输等)、支撑体系(人力资源部、质量部、采购部、信息部、法务部、财务部、行政部等)等几大类,大一点的公司或者集团会以多个子公司或者事业部/群的模式去运作,但系统组织的大框架与常见的基本雷同。细分到团队内部,主要的组织和管理模式有项目驱动型、产品驱动型、矩阵型等几大类。今天我们不讨论太大的话题,主要分享下我在测试团队管理中的一些实战经验:

1、责任清晰和定位明确:曾经有一段时间,我们团队的测试任务很重,我们所有成员不得不穿插在各个测试项目中,进而导致测试开发的同学也参与到了项目的实际测试里,甚至担任了主力,使得测试开发的本身工作受到了影响,也让相关同学感觉做的事情太广太杂了;后来我反思了相关管理方式,除了客观原因之外,还是要把团队成员的职责和定位界限清楚,这样有利于团队建设和长期发展,临时应急可以理解;这个理念一直持续到现在,整个团队发展的越来越好,每个人都各司其职,通力协作,效率很高。

2、持续放权和加强监督:每个员工都需要空间和舞台去展示自我,放权是一种极其有效的激励方式,让员工有更多机会去负责、去决策、去思考,这样可以提高员工的责任感和参与度,通过不断的历练,员工的能力会快速提升;在这个过程中,管理者只需要做好监督就行,不要干预太多,必要时可以引导或者给予建议,但是尽量交由员工自己去判断,哪怕出错也是应该容忍的。

3、制度建设和知识积累:每当做完一件任务,我有两个事情必须要做,第一我会思考相关事情是否可以流程化、规范化和工具化,以纳入测试部的制度体系里,让大家都遵循一定的标准和要求去工作;第二我会把做过的工作转化成知识库,不断的积累,分享给所有人,也鼓励团队成员这样做。

虽然还有很多分享的,我觉得以上这三点非常的重要,所以分享给了大家。团队管理难的是家家有本难念的经,每个团队都有自己的问题,管理理念又没有完全的对错之分,只有管理者结合自己团队的实际情况灵活运用管理知识方可。正如系统组织一样,一定是在动态的调整中,团队管理也是动态的,没有固定不变的模式,更非一劳永逸。

?

备注:下文根据刘润老师的每个人的商学院整理。

本篇是系列书籍6“管理进阶”的第六章“设计系统组织和团队”。

详细笔记内容如下:?

责权利心法:管理的等边三角形

管理的等边三角形叫做责权利心法,即责任、权力和利益之间的对等关系。

责权利心法,就是在任何一个管理单元上,责任、权力和利益这三者必须要同时、对等地发生在一个主体上。

责权利是一个等边三角形,责任过大,会导致管理者负不起相应责任;权力越大,会导致权力的滥用;利益过大,会导致分配不公。设计系统的基本心法是这三者之间必须对等。

如果不对等,会带来各种问题:1、责任越大,会催生消极怠工;2、权力独大,会导致权力寻租(凡权力行使的地方,必有责任);3、利益独大,会引发内耗冲突。

大到CEO,小到前台,都要摆正责任、权力、利益三者之间的对等关系。

手表定律:一个员工不能有两个老板

一个人戴一块手表,一看就知道时间。但如果戴两块,不但不能更准确地判断时间,反而会制造混乱。手表定律是设计系统时的一个大忌。

设计组织有一个铁律:一个领导,可以有多个下属;但是一个员工,只能有一个领导。

如何做,记住两个原则:1、一个上级原则(也许管理者觉得自己不会犯这种低级错误,但其实这种错误无处不在);2、一致管理的原则(绩效指标不能冲突,流程执行必须平等)。

设计系统:如何分钱、花钱、赚钱

公司是一个由各种要素组成的系统,人和其他生产资料一样,都是这个系统中的要素。

激发善意当然有助于提高人的主动性,但同时也要清理包括人在内的所有要素之间的关系,构建有效系统,才能产生巨大的整体价值。

系统管理,就是通过设计系统,来构建人与人、人与财、人与物之间的最佳关系,最终提高管理效率。

管理中有“结构性问题”和“非结构性问题”之分。结构性问题,就是设计系统中各要素之间的结构关系;非结构性问题,就是激发“人”这个特殊要素的主动性,弥补结构的不周密,提升系统的灵活性和强度。

一个好的管理系统,至少包括3个方面:如何分钱,如何花钱,如何赚钱。

分权机制:考核结果还是考核行为

如果每个人尽心尽职做好自己分内的事,公司就一定能赚钱,那么,管理者可以考虑用职能分权制。它的好处是:执行简单,容易专注,效率很高。但对管理要求高。

如果因果关系很难被证明,管理者可以考虑用联邦分权制,给员工权力与利益,请他们对最终结果负责。它的好处是:考核简单,容易激励,主动性高。但对员工要求高。

联邦分权制和职能分权制没有好坏之分,选择用哪个,一定要注意以下几点:1、联邦分权制和职能分权制是两个基础模型,每个公司都一定是同时使用的;2、把联邦分权制往下推行到哪一层,关键要看能不能找到自身行为和最终结果之间的因果关系。

集权与分权:如何避免授权无度

授权从来都不是“是非”的问题,而是“程度”的问题。谁都知道要授权,而优秀的管理者之所以优秀,是因为他们更懂得拿捏这个“度”。

好的授权策略:集权有道(集权、分权的最基本原则上责权利对等;你要什么权,就要担什么责,拿什么利);分权有序(什么权力该分,什么权力不该分,应该有明确的标准和分权程序);授权有章(授权也要有章法);用权有度(确保权力在授权的范围内使用)。

组织模式:千人公司可以”回归创业“吗

基于联邦分权制和职能分权制这两块基础积木,可以搭建出几种典型的组织模型;羽毛球双打模式、足球队模式、交响乐队模式和军队模式。

羽毛球双打模式:没有明确的分工,典型的联邦分权制,考核两个选手的是最终结果;对应到企业中,这种基于信任的黏合适合小企业,员工之间很难有非常明确的分工,所以不考核每个人的自身行为,只考核整个组织的最终结果。

足球队模式:,每个人有明确的分工,但也有很强的自主性。用战略来黏合分工明确,同时也很依赖具有自主性的11块职能积木。

交响乐队模式:有更加明确的分工,这样的组织是典型的职能分权制,无法给予职能基于战略的自主性。用流程来黏合交响乐队中层层分工的职能积木。

军队模式:更严格的职能分权制,大家只需要关心职能内的自身行为的指标,不用关心最终结果。用奖惩来黏合军队中无数细小的职能积木。

阿米巴经营:内部市场化的组织模式

阿米巴模式,是指将大的组织分为小的独立经营体,通过与市场直接联系的独立核算制进行运营,从而实现全员参与的经营模式。其本质是“量化分权”,也叫“内部市场化”。

设计阿米巴经营需要注意以下几点:1、“内部定价”的管理体系;2、“单位时间”的核算制度;3、“哲学共有”的奖励制度。

关于本站

Copyright © 2023 欢迎来到我的小站 备案号:粤ICP备2020117555号 |淘宝互助 |隋唐演义 | 名诗名词 | 淘宝优惠

联系我们

合作或咨询可通过如下方式:

QQ:

邮箱:

关注我们

淘优惠