【问题标题】:Extend str class to take additional parameters扩展 str 类以获取附加参数
【发布时间】:2012-03-02 08:54:58
【问题描述】:

我想创建一个新类,它是一种特殊类型的字符串。我希望它继承 str 类的所有方法,但我希望能够向它传递一个它可以使用的附加参数。像这样的:

class URIString(str, ns = namespace): # ns defaults to global variable namespace
    def getLocalName(self):
        return self[(self.find(ns)+len(ns)):] # self should still act like a string
        # return everything in the string after the namespace

我知道语法不对。但希望它传达了我想要表达的想法。

【问题讨论】:

  • 您应该使用教程来学习如何进行继承。 Stackoverflow 不是用来牵手的。
  • @Marcin:在他的辩护中,如何从 str 继承并不明显......
  • @Marcin:你是整天在 Stackoverflow 上讨论新手问题还是什么?
  • @Marcin - 嘿,三年过去了,我是一个更好的程序员,感谢所有提供帮助的好人,不感谢你毫无价值的评论。

标签: python string class extend


【解决方案1】:

你会想做这样的事情:

class URIString(str):
    _default_namespace = "default"

    def __init__(self, value, namespace=_default_namespace):
        self.namespace = namespace

    def __new__(cls, value, namespace=_default_namespace):
        return super().__new__(cls, value)      

    @property
    def local_name(self):
        return self[(self.find(self.namespace)+len(self.namespace)):]

我使用@property 装饰器将getLocalName() 转换为属性local_name - 在python 中,getter/setter 被认为是不好的做法。

注意,在 Python 3.x 之前,您需要使用super(URIString, cls).__new__(cls, value)

【讨论】:

  • 你试过这个代码吗?它至少存在三个问题。
  • @NedBatchelder 我在编译答案时不小心点击了提交,我会在测试后更新它。
  • 好了,解决了。当我第一次提交时,它就在我的脑海中,所以请原谅最初的不准确。
  • @Lattyware:别担心,仅供参考(因为我曾经遇到过同样的问题)你可以点击删除你的答案,编辑然后取消删除:)
  • __new__() 的第一个参数是类,而不是实例。您返回该实例。所以你需要调用super().__new__()first,然后在返回之前将属性设置在它的返回值上。否则,您将在类上设置 namespace 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2020-11-10
  • 1970-01-01
相关资源
最近更新 更多