атрибут объекта класса Python - PullRequest
0 голосов
/ 16 сентября 2018

объектно-ориентированное программирование - довольно новое для меня.Я просто пытаюсь немного узнать о классах и методах.Я пытаюсь написать простой класс под названием «Объект», а затем определить несколько геометрических объектов, например, круг, прямоугольник и т. Д. Затем я хочу иметь такие атрибуты, как «площадь» и «окружность», где я хотел бы получить доступ к областиобведите в кружок:

class object:
       import numpy as np
       pi = np.pi

       def circle(self):
          def area(self, radius):
             self.area=self.radius**2 * self.pi


s = object()
print(s.__dict__)
print(s.circle.area(5))

При запуске я получаю:

{}
Traceback (most recent call last):
  File "/Users/aya/Desktop/test.py", line 12, in <module>
    print(s.circle.area(5))
AttributeError: 'function' object has no attribute 'area'

Как мне заставить s.circle.area(5) работать?

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Ниже приведен пример, который поможет вам

class Dog:

    # Class Attribute
    species = 'mammal'

    # Initializer / Instance Attributes
    def __init__(self, name, age):
        self.name = name
        self.age = age


# Instantiate the Dog object
philo = Dog("Philo", 5)
mikey = Dog("Mikey", 6)

# Access the instance attributes
print("{} is {} and {} is {}.".format(
    philo.name, philo.age, mikey.name, mikey.age))

# Is Philo a mammal?
if philo.species == "mammal":
    print("{0} is a {1}!".format(philo.name, philo.species))

, когда я запускаю файл, полученный выше.

Philo is 5 and Mikey is 6.
Philo is a mammal!

Пример внутреннего класса

#!/usr/bin/env python

class Human:

  def __init__(self):
    self.name = 'Guido'
    self.head = self.Head()
    self.brain = self.Brain()

  class Head:
    def talk(self):
      return 'talking...'

  class Brain:
    def think(self):
      return 'thinking...'

if __name__ == '__main__':
  guido = Human()
  print guido.name
  print guido.head.talk()
  print guido.brain.think()
0 голосов
/ 17 сентября 2018

Для меня все не ново, но что вы пытаетесь сделать здесь s.circle.area(5) имеет доступ к атрибуту Object, который также должен быть объектом, потому что вы пытаетесь вызвать метод для этого конкретного атрибута.

Ясно, '.'разрешить вам доступ только к атрибуту или функции.Например,

class Square:
    def __init__(self, size):
        self.size = size

    def resize(self, new_size):
        self.size = new_size

#Usage
>>> form = Square(5)
>>> print(form.size)
>>> 5 #output
>>> form.resize(120)
>>> print(form.size)
>>> 120 #output

В вашем коде это действительно странно и не имеет никакого смысла, много путаницы.Вы определяете функциональную область внутри функционального круга, который пытается создать атрибут области, используя объект несуществующий self.radius с существующим атрибутом pi.

Представляя, что что-то подобное может работать, вы пытаетесь получить доступФункция функции, вызывая метод круга (нет смысла, трудно объяснить).

Все еще в нашем квадрате, вы получаете доступ к атрибуту:

>>> form.size

Теперь вы пытаетесьвызовите из него функцию:

>>> form.size.action()

В этом случае вы используете целочисленный метод (int также являются классом, содержащим метод)

Вызывая метод объекта:

>>> form.reshape(8) #changing the current size
>>> form.reshape(8).action()

Таким образом вызывается метод возврата функции изменения формы.Кажется, вы не совсем уверены в определении функции (два ключевых слова def следуют друг за другом, это возможно, но не уверены, что это ваша цель), импорт Я не уверен, что он был выбран действительно мудро (numpy будет импортирован вкаждый объект создания, полезен для вас?).Будь осторожен с основами, чем больше ты будешь базовым, тем сильнее ты будешь понимать, что ты делаешь, а в программировании ты должен знать, что ты делаешь.

Как мнезаставить s.circle.area (5) работать?

По крайней мере, вы можете сделать

import numpy

class Circle:
    def __init__(self, area = 0):
        self.area = area
    def area(self, new_area):
        self.area = new_area
        return self.area


 class Object:
     pi = numpy.pi
     circle = Circle()

 >>> obj = Object()
 >>> obj.circle.area(5)

Я наконец могу сделать это действие!Многие вещи не являются хорошей практикой или не будут иметь желаемого поведения, если они не используются разумно, вы должны понимать, что происходит.Я понимаю, что ты учишься, и это действительно приятно, но не беги (и не очень быстро), не зная, что нужно ходить.(Я, пожалуй, немного извиняюсь, это для вас, будьте осторожны)

PS: Все, о чем я здесь говорил, имеет много документации.Определение класса действительно стандарт в Python.Объектно-ориентированное программирование без создания объекта может быть действительно парадоксальным.Вот некоторая документация: https://docs.python.org/3.7/tutorial/classes.html#a-first-look-at-classes

0 голосов
/ 17 сентября 2018

1) Имя object уже взято в качестве базового объекта Python, вы должны использовать другое имя (Polygon?)

2) Я думаю, вы хотели, чтобы circle был новымкласс, а не функция.Вы можете сделать класс похожим или "наследовать" от другого класса, включив его в объявление класса:

class Circle (Polygon): #NOT object, see number one 
    def __init__ (self, radius): #called to make a new Circle
        self.radius = radius #give this circle its radius
    def area (self): 
        # self.pi is already declared because Polygon states it, and Circles "inherit" that trait 
        return self.pi * (self.radius ** 2)

Теперь, чтобы сделать круг:

circle = Circle (5) # or Circle (radius = 5)
pi = circle.pi 
# or Circle.pi, since it belongs to the whole class (upper-case) and not just the object (lower-case)
area = circle.area() #needs to be on a specific circle, because radii can vary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...