Атрибут объекта класса python

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

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)?

Вы определили круг как метод экземпляра и обрабатываете его как атрибут класса, но ни то, ни другое не имеет смысла; не должен ли круг быть подкласс общего класса формы? Также не отменяйте object.

jonrsharpe 16.09.2018 23:03

Похоже, вам нужен учебник, чтобы понять основные концепции: tutorialspoint.com/python/python_classes_objects.htm

luther 16.09.2018 23:06

@luther Спасибо за ссылку! Вы правы, я понятия не имею, как работают эти классы. Просто пытаюсь использовать свою интуицию при создании объекта, а затем назначении атрибутов ... например, className.atribute1.attribute1 of attribute1 и т.д.

user3578925 16.09.2018 23:10

Я немного помог с ответом, но все еще печатаю.

Levi Lesches 16.09.2018 23:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
394
3

Ответы 3

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

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

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()

Большое спасибо за помощь! Но мне действительно нужно ознакомиться с самыми основами. В конце концов, я хочу узнать, как создавать несколько атрибутов (на самом деле я не знаю, называются ли они атрибутами, например, object.firstattrib.fifth-attrib-of-firstattr и т. д.). Вы знаете какой-либо учебник с объяснением того, как создать класс с такой последовательностью?

user3578925 16.09.2018 23:25

да, я прилагаю одну ссылку, в которой есть очень хорошие руководства по использованию объектно-ориентированного подхода в python. realpython.com/python3-object-oriated-programming

spaceman 16.09.2018 23:27

@ HIMANSHU PATEL Я хочу научиться делать, например, это: ax1.xaxis.set_tick_params(labelsize=10). Вы видите, что у ax1 есть атрибут attr. xaxis, а затем xaxis имеет атрибут attr. set_tick_params. Как создать атрибут атрибута?

user3578925 16.09.2018 23:29

о, значит, вы говорите о внутреннем классе. прикрепляю ссылку ниже pythonspot.com/inner-classes

spaceman 16.09.2018 23:34

дайте мне знать, если вам понадобится дополнительная помощь. Спасибо :)

spaceman 16.09.2018 23:35

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

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

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

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

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

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

>>> form.size

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

>>> form.size.action()

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

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

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

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

How do I make s.circle.area(5) work?

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

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)

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

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

Другие вопросы по теме