Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Python类像实例一样工作?_Python_Python 3.x_Tuples - Fatal编程技术网

如何使Python类像实例一样工作?

如何使Python类像实例一样工作?,python,python-3.x,tuples,Python,Python 3.x,Tuples,我想创建一个类,当我在没有双括号的情况下调用时,它在任何上下文中返回一个值,就像str或int所做的一样。例如,我可以做些什么来实现这一点: >>类别颜色: ... 定义初始化(self,r,g,b): ... self.r=r ... self.g=g ... self.b=b ... def无论是什么(自我): ... return(self.r、self.g、self.b)#类返回元组 >>>myColor=颜

我想创建一个类,当我在没有双括号的情况下调用时,它在任何上下文中返回一个值,就像
str
int
所做的一样。例如,我可以做些什么来实现这一点:

>>类别颜色:
...     定义初始化(self,r,g,b):
...         self.r=r
...         self.g=g
...         self.b=b
...     def无论是什么(自我):
...         return(self.r、self.g、self.b)#类返回元组
>>>myColor=颜色(16,32,64)
>>>myColor.g
32
>>>霉色
(16, 32, 64)
>>>颜色(5、68、37)
(5, 68, 37)
我的目标是创建一个与Pygame兼容的颜色类。例如,我可以做
mySurface.fill(颜色(16,32,64))
,这与
mySurface.fill((16,32,64))
相同。我的color类类似于pygame.math.Vector2,但它是用Python编写的,而不是用C编写的

除此之外,我还有一个不需要回答的额外问题:如何创建一个无法构建的类?

这在Python3.9中可能吗

最终编辑:下面的答案并不完全有效。我的意思是:

>>> myColor = color(1, 2, 3)
>>> myColor
(1, 2, 3)
>>> myColor.g
2
>>> myColor.g = 4
>>> myColor
(1, 2, 3)
>>> myColor.g
4

我已经了解了
\uuuu iter\uuuu
魔术方法,我的最高优先级是通过将类转换为元组实现Pygame兼容性,因此。。。¯\_(ツ)_/“

您希望类的行为类似于一个
元组
,但您还希望添加一些自定义属性以达到颜色代码(即
myColor.g
)。在这种情况下,您可以对
元组
进行子类化,并编写一个自定义的
\uuuuuuuuu new\uuuu

class color(tuple):
    def __new__ (cls, r, g, b):
        # Here we are saying that initialize a new tuple with
        # arguments we provided. tuple expects one parameter
        # so we are sending r, g, b as one parameter: (r, g, b)
        return super(color, cls).__new__(cls, (r, g, b))

    def __init__(self, r, g, b):
        # Then we can add whatever attribute we like to our tuple.
        self.r = r
        self.g = g
        self.b = b

>>> myColor = color(16, 32, 64)
>>> myColor.g
32
>>> myColor
(16, 32, 64)
>>> myColor == (16, 32, 64)
True
正如kaya3在评论中所建议的,同样的事情也可以通过使用
namedtuple
s实现:

>>> from collections import namedtuple
>>> color = namedtuple('color', ('r', 'g', 'b'))
>>> myColor = color(16, 32, 64)
>>> myColor.g
32
>>> myColor
color(r=16, g=32, b=64)
>>> myColor == (16, 32, 64)
True

您希望类的行为类似于
元组
,但您还希望添加一些自定义属性以达到颜色代码(即
myColor.g
)。在这种情况下,您可以对
元组
进行子类化,并编写一个自定义的
\uuuuu new\uuuu

class color(tuple):
    def __new__ (cls, r, g, b):
        # Here we are saying that initialize a new tuple with
        # arguments we provided. tuple expects one parameter
        # so we are sending r, g, b as one parameter: (r, g, b)
        return super(color, cls).__new__(cls, (r, g, b))

    def __init__(self, r, g, b):
        # Then we can add whatever attribute we like to our tuple.
        self.r = r
        self.g = g
        self.b = b

>>> myColor = color(16, 32, 64)
>>> myColor.g
32
>>> myColor
(16, 32, 64)
>>> myColor == (16, 32, 64)
True
正如kaya3在评论中所建议的,同样的事情也可以通过使用
namedtuple
s实现:

>>> from collections import namedtuple
>>> color = namedtuple('color', ('r', 'g', 'b'))
>>> myColor = color(16, 32, 64)
>>> myColor.g
32
>>> myColor
color(r=16, g=32, b=64)
>>> myColor == (16, 32, 64)
True

有帮助吗?我如何创建一个无法构造的类,你这是什么意思?你不能定义一个构造函数(
\uuuuu init\uuuuu
方法)@limserhane我想调用类
thisClass
来获得一个值,而不需要使用
tuple()进行转换
等等。你可以让你的类成为tuple的扩展,或者在本例中只使用
集合中现有的
。或者让你的类成为a,就像tuple一样。但是你问的问题没有神奇的方法,因为你如何区分何时应该访问实例和何时包装它的值?为什么如果可以简单地使用元组,是否要创建一个用作元组的类?mycl=(16,43200)然后使用mycol…你可以在某处将其创建为常量并使用它…创建一个类只是为了拥有一个类对我来说毫无意义?对你有帮助吗?我如何创建一个无法构造的类,你这么说是什么意思?你不能定义一个构造函数(
\uuu init\uu
方法)@limserhane我想调用类
thisClass
,使用
tuple()不进行转换就获得一个值
等等。你可以让你的类成为tuple的扩展,或者在本例中只使用
集合中现有的
。或者让你的类成为a,就像tuple一样。但是你问的问题没有神奇的方法,因为你如何区分何时应该访问实例和何时包装它的值?为什么如果可以简单地使用元组,是否要创建一个用作元组的类?mycl=(16,43200)然后使用mycol…你可以在某处将其创建为常量并使用它…创建一个类只是为了拥有一个类对我来说毫无意义?非常感谢!我希望你能解释一下新方法中发生了什么。我不太了解super()的用法很有效。@BlueStaggo你可以检查编辑。我希望现在它更清晰。这是一种创建
集合的冗长方法。namedtuple
@kaya3我不知道
namedtuple
s可以做到这一点。我会编辑这篇文章来提及它。谢谢!稍微简短一点:
namedtuple('color',r g b'))
因为构造函数接受一个以空格分隔的属性名字符串。非常感谢!我希望你能解释一下新方法中发生了什么。我不太知道super()是如何实现的很有效。@BlueStaggo你可以检查编辑。我希望现在它更清晰。这是一种创建
集合的冗长方法。namedtuple
@kaya3我不知道
namedtuple
s可以做到这一点。我会编辑这篇文章来提及它。谢谢!稍微简短一点:
namedtuple('color',r g b'))
因为构造函数接受以空格分隔的属性名称字符串。