小编she*_*fly的帖子

python中dir和__dict__之间的最大区别是什么

class C(object):
    def f(self):
        print self.__dict__
        print dir(self)
c = C()
c.f()
Run Code Online (Sandbox Code Playgroud)

输出:

{}

['__class__', '__delattr__','f',....]
Run Code Online (Sandbox Code Playgroud)

为什么自己没有"f".__ dict__

python introspection

61
推荐指数
2
解决办法
2万
查看次数

无法覆盖irb中的to_s

我在pry中定义了一个函数:to_s,但是我无法调用它.这种方法在哪里,我怎么称呼它?

pry(main)> def to_s
pry(main)*   'hello'
pry(main)* end
pry(main)> to_s
=> "main"
Run Code Online (Sandbox Code Playgroud)

我的ruby版本是2.1.2

在阅读了一些答案并进行搜索之后,我想我得到了正确的答案:

  1. 这种方法在哪里?

当在irb或pry中定义一个方法时,它会转到 Object.instance_methods

[1] pry(main)> def to_s
[1] pry(main)*   'hello'
[1] pry(main)* end
=> :to_s
[2] pry(main)> def hello
[2] pry(main)*   'world'
[2] pry(main)* end
=> :hello
[4] pry(main)> Object.instance_methods(false)
=> [:pry, :__binding__, :to_s, :hello]
Run Code Online (Sandbox Code Playgroud)
  1. 我怎么称呼它?

可以在新对象中调用这些新方法.

[6] pry(main)> Object.new.to_s
=> "hello"
Run Code Online (Sandbox Code Playgroud)

我无法在顶层调用to_s的原因是这main是一个定义a #to_s#inspect方法的特殊对象.

[5] pry(main)> singleton_class.instance_methods(false)
=> [:to_s, :inspect]
Run Code Online (Sandbox Code Playgroud)

ruby

5
推荐指数
1
解决办法
323
查看次数

为什么 Go 的通道可以关闭两次?

当我在做一些 go 练习代码时,我遇到了一个问题,一个通道可以像这样关闭两次:

// jobs.go

package main

import (
   "fmt"
)

func main() {
    fmt.Println("Hello, playground")
    jobs := make(chan int, 5)
    done := make(chan bool)

    go func() {
        for {
            j,more := <-jobs

            fmt.Println("receive close: ", j, more)
            done <- true   
        }
    }()

    close(jobs)
    <- done
}
Run Code Online (Sandbox Code Playgroud)

输出:

~ go run jobs.go
Hello, playground
receive close:  0 false
receive close:  0 false
Run Code Online (Sandbox Code Playgroud)

但是当我手动关闭频道两次时,我得到了panic: close of closed channel.

为什么上面的代码可以接收close两次?

channel go

2
推荐指数
1
解决办法
9255
查看次数

标签 统计

channel ×1

go ×1

introspection ×1

python ×1

ruby ×1