调用实例时的不同类型

时间:2013-04-20 11:04:16

标签: python

我有以下代码:

#

 def macierz(self, R, alfa, beta):
 #   '''Definiuje macierz przeksztalcenia.'''
 #   alfa=float(self.rad(alfa))
 #   beta=float(self.rad(beta))
 #   R=float(R)
 #   B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])

  def konwersja(self):
    '''Ta funkcja przeprowadza konwersje listy wsp wewnetrznych na wspolrzedne kartezjanskie.'''
    listaB=[]
    R=2
    alfa=1
    beta=1
    B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])
    lista_xyz=[]
    #matrix=self.macierz
    j=0
    q=self.array((0., 0., 0., 1.)).reshape(4,1)
    while j<len(self.lista):
    #  B=matrix(self.lista[j+1], self.lista[j+3], self.lista[j+5])
      q=self.dot(B, q)
      print self.lista[j], q[0,0], q[1,0], q[2,0]
      break

,工作正常,但当我将其更改为:

 def macierz(self, R, alfa, beta):

    '''Definiuje macierz przeksztalcenia.'''
    alfa=float(self.rad(alfa))
    beta=float(self.rad(beta))
    R=float(R)
    B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])

  def konwersja(self):
    '''Ta funkcja przeprowadza konwersje listy wsp wewnetrznych na wspolrzedne kartezjanskie.'''
    listaB=[]
    R=2
    alfa=1
    beta=1
    lista_xyz=[]
    matrix=self.macierz
    j=0
    q=self.array((0., 0., 0., 1.)).reshape(4,1)
    while j<len(self.lista):
      B=matrix(self.lista[j+1], self.lista[j+3], self.lista[j+5])
      q=self.dot(B, q)
      print self.lista[j], q[0,0], q[1,0], q[2,0]
      break

我明白了:

File "./zmat_xyz.py", line 37, in konwersja
    q=self.dot(B, q)
TypeError: unsupported operand type(s) for *: 'NoneType' and 'float'

为什么,当我调用macierz函数类型时,无法识别?

好吧,我认为我上面写的内容非常令人困惑。这是完整的代码:

#!/usr/bin/python
class Internal:
  from numpy import sin, cos, radians, array, pi, dot, zeros, reshape
  rad=radians
  lista=[]
  i=0
  def dane(self, plik_zmat):
    '''Ta funkcja przygotowuje plik zmat, typu MOPAC do odczytu przez funkcje konwersja.'''
    plik=open(plik_zmat, 'r+')
    for linijka in plik:
      for slowo in linijka.split():
        try:
          slowo=float(slowo)
        except ValueError:
          pass
        self.lista.append(slowo)
    while self.i<6:
      self.lista.pop(0)
      self.i+=1

 # def macierz(self, R, alfa, beta):
 #   '''Definiuje macierz przeksztalcenia.'''
 #   alfa=float(self.rad(alfa))
 #   beta=float(self.rad(beta))
 #   R=float(R)
 #   B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])

  def konwersja(self):
    '''Ta funkcja przeprowadza konwersje listy wsp wewnetrznych na wspolrzedne kartezjanskie.'''
    listaB=[]
    R=2
    alfa=1
    beta=1
    B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])
    lista_xyz=[]
    #matrix=self.macierz 
    j=0
    q=self.array((0., 0., 0., 1.)).reshape(4,1)
    while j<len(self.lista):
    #  B=matrix(self.lista[j+1], self.lista[j+3], self.lista[j+5])
      q=self.dot(B, q)
      print self.lista[j], q[0,0], q[1,0], q[2,0]
      break

Internal().dane('formaldehyd.zmat')
print Internal().lista
Internal().konwersja()

1 个答案:

答案 0 :(得分:1)

您的return函数中没有macierz个语句。这会导致Python返回隐式None。你在错误中注意到了。

更改以下行:

B=self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])

为:

return self.array([[-self.cos(alfa), -self.sin(alfa), 0, -R*self.cos(alfa)], [self.sin(alfa)*self.cos(beta), -self.cos(alfa)*self.cos(beta), -self.sin(beta), R*self.sin(alfa)*self.cos(beta)], [self.sin(alfa)*self.sin(beta), -self.cos(alfa)*self.sin(beta), self.cos(beta), R*self.sin(alfa)*self.cos(beta)], [0, 0, 0, 1]])

这将返回创建的数组并将其分配到B中的konwersja名称。