Метод класса Python: объект не имеет атрибута + объект не является подписным - PullRequest
0 голосов
/ 10 января 2019
class elem:
    def __init__(self, coords):
        if not coords.shape == (2, 3):
            raise TypeError("")
    def Jac(self, f):
        x1, x2, x3 = self[0,:]
        y1, y2, y3 = self[1,:]
        A = array([[x2 - x1, x3 - x1],
                   [y2 - y1, y3 - y1]])
        J = det(A)
    def f_(xi, eta):
        x = x1 + (x2 - x1)*xi + (x3 - x1)*eta
        y = y1 + (y2 - y1)*xi + (y3 - y1)*eta
        return f(x, y)
    return (1/6)(f_(0, 0) + f_(0, 1) + f_(1, 0))

def f(x, y):
    return x**2/10 - y**2/10 + 1

el = array([[3, 11, 0],
            [0, 4, 6]])
EL = elem(el)
print(EL.Jac(f))

Когда я запускал этот код, возникла ошибка TypeError: объект 'elem' не подлежит подписке. Если я подставлю

x1, x2, x3 = self[0,:]

с

x1, x2, x3 = self.coords[0,:]

это вызовет AttributeError: у объекта 'elem' нет атрибута'ordins '.

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 10 января 2019

__getitem__

Для того, чтобы объект был субстригируемым, необходимо реализовать getitem (https://docs.python.org/3/reference/datamodel.html#object.getitem) в классе.

Однако вам необходимо присвоить значение объекту, например

class Some:

    def __init__(self, v):
        self.v = v

    def __getitem__(self, i):
        return self.v[i]


some = Some([1,2,3])
print(some[:2])

Результаты в

[1, 2]

Это должно работать и с numpy, который, я полагаю, вы используете.

collections.UserList

По сути, вы хотите расширить функциональность списков. Вы можете использовать класс UserList из модуля сборки в коллекциях: https://docs.python.org/3/library/collections.html#collections.UserList

Однако, насколько я знаю, это не работает с массивами-пустышками.

numpy.ndarray

В numpy вы можете наследовать от класса ndarray, например:

from numpy import ndarray


class A(ndarray):    
    def custom_function(self, x):
        return self + x

a = A([1,2,3])
print(a.custom_function(666))

результат в

A([[[666., 666., 666.],
    [666., 666., 666.]]])

Ссылки:

https://docs.scipy.org/doc/numpy/user/basics.subclassing.html#basics-subclassing https://docs.scipy.org/doc/numpy/reference/arrays.classes.html https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html#numpy.ndarray

Оба примера являются подписными.

Надеюсь, это поможет.

Еще немного

Ваш код не будет работать, потому что вместо функции у вас есть оператор return в теле класса.

Пожалуйста, не забывайте ставить импортные заявления в вопросах. массив не является частью стандартной библиотеки Python. Я просто догадываюсь, что это пустышка из-за свойства shape.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...