【问题标题】:Code Study-New to programming代码学习-编程新手
【发布时间】:2016-07-25 12:56:49
【问题描述】:

我是编程新手,一直在研究一些代码以了解 OOP。以下是我所了解并需要帮助的内容, 1) import gym and env=gym.make('String') : 也就是说gym是一个库,make是它下面的一个类?我们是否创建了一个对象实例?

我知道类中包含方法..即函数..但在这种情况下我无法清楚地破译。这个 env.monitor.start()..this 之后的行包含 3 个部分..每个部分是什么指示..我认为 env 是一个较早实例化的对象。

import gym
env = gym.make('CartPole-v0')
env.monitor.start('/tmp/cartpole-experiment-1',force=True)
for i_episode in range(20):
    observation = env.reset()
    for t in range(1009):
        env.render()
        print(observation)
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)
        if done:
            print("Episode finished after {} timesteps".format(t+1))
            break

env.monitor.close()

感谢您的帮助,如果问题很愚蠢,请道歉

【问题讨论】:

  • 您似乎对 for 循环感到困惑?你可以查一下。它是循环的标准编程结构
  • 您好,因为循环不是我的问题.. env.monitor.start 等访问..即与类和对象相关的访问是我的问题
  • @Thiagarajan,看看我的回答。

标签: python class libraries


【解决方案1】:

这是上述程序的基本结构:

import 语句将模块带入程序。这些模块包含功能。该模块能够使用这些功能。例如,

import myMod as mM

mM.fooFunc()

导入一个模块myMod 并给它一个别名mMfooFunc 属于模块内部,因此我们可以调用它。

我们不需要别名。我们也可以直接说

import myMod
myMod.fooFunc()

但稍微不方便。

env 只是函数gym.make('CartPole-v0') 的返回值的名称。函数总是返回一些东西,例如实际对象、整数类型(如整数或字符串)或None

返回值不需要一直保存,比如env.monitor.start('/tmp/cartpole-experiment-1',force=True)。它只是执行一些数据操作。

至于程序的其余部分,它由for-loops 和if 语句运行。 Read about it here.

【讨论】:

  • 好的,除了 env.monitor.start() 之外,我得到了大部分内容..说 env=gym.make() 已作为一个对象..一个对象可以具有各种属性.. .like env.name 等等..但是当我们两次使用点运算符时是什么意思..like env.monitor.start()
  • @Thiagarajan 请注意,env.monitor 在监视器周围没有括号。这意味着它是env 的一个属性。然后在 env.monitor 属性上调用 start 函数。
【解决方案2】:

gym可以是包或模块。没有办法通过它的 import 语句来判断它是什么。

env = gym.make('CartPole-v0') 可以将调用函数make 的返回值从gym 分配给变量env,或者创建一个类make 的项并将该项分配给变量env

env.monitor.start('/tmp/cartpole-experiment-1',force=True) 表示env 变量很可能返回了一个具有名为monitor 的属性/子类的类项。该属性/子类拥有一个名为start

的函数

env 很可能还有一个子类/属性action_space 和一个函数sample

【讨论】:

    【解决方案3】:

    gym.make('CartPole-v0') 返回一个对象。

    因此,'env' 是一个对象

    'env' 包含一个属性 'monitor',它也是一个对象

    'start' 方法是 'monitor' 对象 的方法,而不是 env 对象。

        env = gym.make('CartPole-v0')
        env.monitor.start('/tmp/cartpole-experiment-1',force=True)
    

    另一种写法是 (env.monitor).start('/tmp/cartpole-experiment-1',force=True)

    为了重复,

     env.reset() 
    #env is object, reset is method of env object
    
     env.render() 
    #env is object, render is method of env object
    
     env.action_space.sample() 
    #env is object, action_space is object, sample is method of action_space object
    
     env.step(action) 
    #env is object, step is method of env object
    

    【讨论】:

      【解决方案4】:

      gym 可以是包或模块。 import 语句并没有告诉您 gym 是什么。

      gym.make 表示您正在从gym 调用一个名为“make”的方法。

      env 就是make('CartPole-v0') 返回的任何东西,它可能是也可能不是对象。它有一个似乎可以从方法monitor.start() 启动的monitor 属性,所以我猜是这样,但是如果不查看gym 的代码或调用type(env),您将无法知道这一点。

      env.monitor.start() 表示调用来自env.monitor 的start 方法。 env.monitor 是什么,如果不查看gym的代码就无法确定。

      【讨论】:

      • gym.make(XX) 也可以是在gym中定义的“make”类项目的创建,在其初始化中需要一个字符串
      • 那么 env.monitor.start 意味着什么......如果 env 是一个对象,也许 env.monitor 将访问一个名为 monitor 的方法......但是开始呢
      • 是的,如果gym中的方法make返回一个'make'对象。广义上讲,envgym.make(xx) 返回的任何东西是正确的。
      • @Thiagarajan 存在“类方法”,它们是给定类的函数,可以用类的名称调用(并且不依赖于类的项)。如果monitor 是模块/包gym 中的一个类,那么start can be one such functions
      • @Thiagarajan env.monitor.start()env.monitor 中调用 start() 方法。