GVKun编程网logo

Python中'self'一词的目的是什么?(self在python中指什么)

17

以上就是给各位分享Python中'self'一词的目的是什么?,其中也会对self在python中指什么进行解释,同时本文还将给你拓展c#–在Batch方法中使用Select(x=>x)的目的是什么?

以上就是给各位分享Python中'self'一词的目的是什么?,其中也会对self在python中指什么进行解释,同时本文还将给你拓展c# – 在Batch方法中使用Select(x => x)的目的是什么?、del self vs self .__ del __() – 什么是在python中清理的正确方法?、Python / NumPy中meshgrid的目的是什么?、python – numpy.where返回一个元组的目的是什么?等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Python中'self'一词的目的是什么?(self在python中指什么)

Python中'self'一词的目的是什么?(self在python中指什么)

Python中self这个词的目的是什么?我知道它是指从该类创建的特定对象,但是我看不到为什么需要将它作为参数显式添加到每个函数中。为了说明这一点,在Ruby中,我可以这样做:

class myClass    def myFunc(name)        @name = name    endend

我很容易理解。但是在Python中,我需要包括self

class myClass:    def myFunc(self, name):        self.name = name

答案1

小编典典

让我们看一个简单的向量类:

class Vector:    def __init__(self, x, y):        self.x = x        self.y = y

我们希望有一种计算长度的方法。如果我们想在类中定义它,它将是什么样?

    def length(self):        return math.sqrt(self.x ** 2 + self.y ** 2)

当我们将其定义为全局方法/函数时,它应该是什么样?

def length_global(vector):    return math.sqrt(vector.x ** 2 + vector.y ** 2)

因此,整个结构保持不变。我该如何利用呢?如果暂时假设我们没有length为Vector类编写方法,则可以执行以下操作:

Vector.length_new = length_globalv = Vector(3, 4)print(v.length_new()) # 5.0

之所以有效,是因为的第一个参数length_global可以用作中的self参数length_new。没有明确的指示,这将不可能self。

理解显式需求的另一种方法self是查看Python在何处添加了一些语法糖。当你牢记时,基本上,

v_instance.length()

在内部转换为

Vector.length(v_instance)

很容易看到self适合的位置。你实际上并没有用Python编写实例方法;你编写的是必须将实例作为第一个参数的类方法。因此,你必须将实例参数显式放置在某处。

答案2

小编典典

需要使用self的原因.是因为Python不使用@语法来引用实例属性。Python决定以一种使该方法所属的实例自动传递但不会自动接收的方式进行方法:方法的第一个参数是调用该方法的实例。这使方法与函数完全相同,并保留实际名称供您使用(尽管self是约定俗成,当您使用其他东西时,人们通常会皱着眉头。)self对于代码而言并不特殊,它只是另一个对象。

Python可以做一些其他事情来区分普通名称和属性-像Ruby这样的特殊语法,或者像C ++和Java这样的声明都需要,或者也许还有其他不同-但事实并非如此。Python的全部目的是使事情变得明确,使事情变得显而易见,尽管它并非在所有地方都做到这一点,但它确实为实例属性做到了。这就是为什么分配给实例属性需要知道要分配给哪个实例的原因,这就是为什么需要它的原因self.。

c# – 在Batch方法中使用Select(x => x)的目的是什么?

c# – 在Batch方法中使用Select(x => x)的目的是什么?

我正在查看 Batch方法的源代码,我看到了这个:
// Select is necessary so bucket contents are streamed too
yield return resultSelector(bucket.Select(x => x));

有一条我不太明白的评论.我已经测试了这种方法而没有使用Select,它运行良好.但似乎有一些我遗漏的东西.我想不出任何必要的例子,那么在这里使用Select(x => x)的实际目的是什么?

以下是完整的源代码供参考:

private static IEnumerable<TResult> BatchImpl<TSource,TResult>(
        this IEnumerable<TSource> source,int size,Func<IEnumerable<TSource>,TResult> resultSelector)
    {
        TSource[] bucket = null;
        var count = 0;

        foreach (var item in source)
        {
            if (bucket == null)
                bucket = new TSource[size];

            bucket[count++] = item;

            // The bucket is fully buffered before it's yielded
            if (count != size)
                continue;

            // Select is necessary so bucket contents are streamed too
            yield return resultSelector(bucket.Select(x => x));

            bucket = null;
            count = 0;
        }

        // Return the last bucket with all remaining elements
        if (bucket != null && count > 0)
            yield return resultSelector(bucket.Take(count));
    }

解决方法

总结评论中的内容,理论上这是多余的.在这种情况下,延迟执行无关紧要.在收益率已经完成执行:已经计算了桶的内容,没有什么可以推迟.

迭代器块行为也没有问题 – 每次我们回到这个实现时,都会重置并重新创建存储桶(在yield之后,bucket = null).即使有人将结果转换为数组类型并修改它,我们也不在乎.

这种方法的一个优点似乎只是优雅:在对resultSelector的所有调用之间存在类型一致性.没有“冗余”选择,实际类型大部分时间都是TSource [],IEnumerable< TSource>对于没有填满整个桶的尾随元素.

但是,可以想象以下场景:

>使用此函数的人注意到实际类型是数组
>由于需要提高性能,他们将收到的批量转换为TSource [](例如,他们现在可以更有效地跳过元素,as Skip is not optimized for arrays)
>他们使用该方法没有任何问题,因为在他们的情况下发生Count()%size == 0

直到,之后,会发生一个额外的元素弹出,导致最后一个产量被执行.现在,对TSource []的强制转换将会失败.

因此,根据元素的数量和大小,方法在结果类型方面的行为会不一致(传递给给定的回调).可以想象其他复杂的情况,这种不一致可能会导致麻烦,例如某些ORM,根据实际类型,将对象序列化到不同的表中.在这种情况下,数据片段最终会出现在不同的表格中.

这些场景当然都是基于其他一些错误,并没有证明没有Select实现是错误的.然而,从某种意义上说,它对Select更加友好,它将这种不幸情景的数量减少到最少.

del self vs self .__ del __() – 什么是在python中清理的正确方法?

del self vs self .__ del __() – 什么是在python中清理的正确方法?

我有一个包含类的 python脚本.

这个类有一个__del__方法用于常规清理.如果我在正常执行脚本期间删除了类,我想要完成一些清理工作.

我也有一个信号处理程序,它做了一些不寻常的清理工作.如果脚本在收到信号时正在执行其他操作,则需要进行一些额外的清理,然后进行常规清理.

我注意到做del self和self .__ del __()之间有区别.

也就是说,self .__ del __()调用del方法两次.

你能解释一下为什么会这样吗?

这是一个模拟脚本来说明问题:

import sys
import signal
from optparse import OptionParser


class TestClass(object):
    def __init__(self,del_self):
        self.del_self = del_self

        print "__init__ with del_self = %s" % self.del_self

    def __del__(self):
        print "Now performing usual cleanup."

    def signal_handler(self,arg_1,arg_2):
        print "Received signal. Now performing unusual cleanup."

        # Unusual cleanup

        print "Did unusual cleanup"

        if self.del_self:
            print("Doing del self")
            del self
        else:
            print("Doing self.__del__()")
            self.__del__()

        sys.exit(0)


if __name__ == '__main__':
    arguments = sys.argv[1:]
    parse = OptionParser("Test.")
    parse.add_option(
        "-d","--delself",help="Set del self.",type="int",default=1
    )

    (options,_) = parse.parse_args()

    print "Options: %s" % options

    tc = TestClass(del_self=options.delself)

    signal.signal(signal.SIGQUIT,tc.signal_handler)

    while True:
        pass

如果我运行脚本:

python deltest.py --delself 1

并发出killall -3 python我得到:

Received signal. Now performing unusual cleanup.
Did unusual cleanup
Doing del self
Now performing usual cleanup.

在哪里,如果我再次执行python deltest.py –delself 0后跟kill信号,我得到:

Received signal. Now performing unusual cleanup.
Did unusual cleanup
Doing self.__del__()
Now performing usual cleanup.
Now performing usual cleanup.

为什么__del__方法在这种情况下执行了两次?

谢谢!

解决方法

del self几乎没有 – 它只删除名为self的局部变量.但由于这不是对实例的最后一次引用(无论什么叫做此方法,至少还有引用),该对象将继续存在.

除了运行该方法外,手动调用__del__也没有任何作用;它不会删除任何东西.

什么工作是删除对象的最后一个引用:在这种情况下,主方法内的del tc将删除最后一个引用,据我所知.然后该对象将被垃圾收集,然后Python调用__del__.

这就是__del__发生两次的原因:一次是手动将其称为普通函数,一次是在程序结束时对象进行垃圾回收.

Python / NumPy中meshgrid的目的是什么?

Python / NumPy中meshgrid的目的是什么?

有人可以向我解释meshgridNumpy 中函数的目的是什么吗?我知道它为绘图创建了某种坐标网格,但我看不到它的直接好处。

我正在学习 Sebastian Raschka 的“Python
机器学习”,他正在使用它来绘制决策边界。请参见此处的输入 11 。

我也尝试过官方文档中的这段代码,但是,输出对我来说真的没有意义。

x = np.arange(-5,5,1)
y = np.arange(-5,1)
xx,yy = np.meshgrid(x,y,sparse=True)
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
h = plt.contourf(x,z)

如果可能的话,请给我展示很多真实世界的例子。

python – numpy.where返回一个元组的目的是什么?

python – numpy.where返回一个元组的目的是什么?

当我运行此代码时:

import numpy as np
a = np.array([1,2,3,4,5,6])
print(np.where(a > 2))

获得一个指数数组是很自然的,其中一个> 2,即[2,5],但我们得到:

(array([2,dtype=int64),)

即一个空的第二个成员的元组.

然后,为了获得numpy.where的“自然”答案,我们必须这样做:

np.where(a > 2)[0]

这个元组有什么意义?它在哪种情况下有用?

注意:我在这里只是谈论用例numpy.where(cond)而不是numpy.where(cond,x,y)也存在(参见文档).

解决方法

numpy.where返回一个元组,因为元组的每个元素都引用一个维度.

在2个维度中考虑此示例:

a = np.array([[1,6],[-2,1,5]])

print(np.where(a > 2))

(array([0,1],array([2,dtype=int64))

如您所见,元组的第一个元素是指相关元素的第一维;第二个元素指的是第二个维度.

这是一个经常使用的常规numpy.当你要求数组的形状时,你也会看到它,即一维数组的形状将返回一个带有1个元素的元组:

a = np.array([[1,5]])

print(a.shape,a.ndim)  # (2,6) 2

b = np.array([1,6])

print(b.shape,b.ndim)  # (6,) 1

我们今天的关于Python中'self'一词的目的是什么?self在python中指什么的分享就到这里,谢谢您的阅读,如果想了解更多关于c# – 在Batch方法中使用Select(x => x)的目的是什么?、del self vs self .__ del __() – 什么是在python中清理的正确方法?、Python / NumPy中meshgrid的目的是什么?、python – numpy.where返回一个元组的目的是什么?的相关信息,可以在本站进行搜索。

本文标签: