【问题标题】:Contain sphere script into in Class在类中包含球体脚本
【发布时间】:2017-08-23 03:13:46
【问题描述】:

我正在尝试将此脚本包含在一个类中。这是为了了解类是如何工作的,并使这些函数可以在其他地方使用。

这个脚本在 3D matplotlib 中创建一个球体。球体的方程是 x^2 + y^2 + z^2 = r^2。如果我们将系数添加到任何变量,它会将球体拉长或缩短为椭圆。我希望能够调用这个类并改变 r(radius) 值,也许还有一些系数。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# CREATE EMPTY LISTS
xs = []
ys = []
zs = []

# FOR EACH Z PLANE "z=dd", 
# CREATE CIRCLE WITH RADIUS ppp "ppp=100-dd^2"
def generateZ(dd):
    ppp = 100 - dd**2
    for xxx in range(-10,10):
        zs.append(dd)
        xs.append(xxx)
        yyy = np.sqrt(ppp - xxx**2)
        ys.append(yyy)
    for xxx in range(-10,10):
        zs.append(dd)
        xs.append(xxx)
        yyy = -np.sqrt(ppp - xxx**2)
        ys.append(yyy)

# GENERATE X AND Y'S FOR EACH Z
for dd in range(-10,10):
    generateZ(dd)

# SCATTER X,Y, AND Z COORDINATES
ax.scatter(xs, ys, zs)

# LABEL AXES
ax.set_xlabel("x axis")
ax.set_ylabel("y axis")
ax.set_zlabel("z axis")

# SET DIMENSIONS OF GRAPH
ax.set_ylim([-12,12])
ax.set_xlim([12,-12])
ax.set_zlim([-12,12])
# SHOW GRAPH
plt.show()

我尝试过简单地添加类容器并调用它。结果是 self 没有被定义...

这是尝试。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

class Sphere(object):

    def __init__(self):
        self.xs = []
        self.ys = []
        self.zs = []

    # CREATE EMPTY LISTS


    # FOR EACH Z PLANE "z=dd", 
    # CREATE CIRCLE WITH RADIUS ppp "ppp=100-dd^2"
    def generateZ(self, dd):
        self.ppp = 100 - dd**2
        for xxx in range(-10,10):
            self.zs.append(dd)
            self.xs.append(xxx)
            self.yyy = np.sqrt(ppp - xxx**2)
            self.ys.append(yyy)
        for xxx in range(-10,10):
            self.zs.append(dd)
            self.xs.append(xxx)
            self.yyy = -np.sqrt(ppp - xxx**2)
            self.ys.append(yyy)

    # GENERATE X AND Y'S FOR EACH Z
    for dd in range(-10,10):
        self.generateZ(dd)

    # SCATTER X,Y, AND Z COORDINATES
    self.ax.scatter(xs, ys, zs)

    # LABEL AXES
    self.ax.set_xlabel("x axis")
    self.ax.set_ylabel("y axis")
    self.ax.set_zlabel("z axis")

    # SET DIMENSIONS OF GRAPH
    self.ax.set_ylim([-12,12])
    self.ax.set_xlim([12,-12])
    self.ax.set_zlim([-12,12])

    # SHOW GRAPH
    self.plt.show()

john = Sphere.generateZ(10)

【问题讨论】:

  • 太棒了。现在我在这里没有看到任何课程,您的问题到底是什么?
  • 对不起。刚刚编辑。任何帮助表示赞赏。不精通类的使用。
  • 你应该阅读类、__init__ 函数等...

标签: python class matplotlib 3d


【解决方案1】:

在使用类或函数时,保持缩进一致至关重要。在示例代码中,缩进是错误的。

如果我们纠正这个问题,剩下的问题是类没有被初始化。说明我们不需要 matplotlib 或任何复杂的代码。 考虑下面的类。

class Foo(object):
    def __init__(self, arg):
        self.arg = arg

    @staticmethod    
    def mystaticmethod(arg):
        print(arg)

    def mymethod(self, arg):
        print(arg)
        print(self.arg)

它有一个__init__ 方法和另外两个方法。一种是静态方法,另一种是普通方法。由于静态方法不依赖于被实例化的类,你可以这样称呼它

Foo.mystaticmethod(3)

但是,如果您尝试对 mymethod 进行相同操作,

Foo.mymethod(3)

它将失败,因为该类尚未实例化,即没有 Foo 的实例,即 self。为了使用这个方法,你首先需要一个类的实例。

Foo(4).mymethod(3)

我会让你把这个概念翻译到你的课堂上。

【讨论】:

    猜你喜欢
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2014-07-21
    相关资源
    最近更新 更多