объектно-ориентированное программирование для меня довольно ново. Я просто пытаюсь немного узнать о классах и методах. Я пытаюсь написать простой класс под названием 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)?
Похоже, вам нужен учебник, чтобы понять основные концепции: tutorialspoint.com/python/python_classes_objects.htm
@luther Спасибо за ссылку! Вы правы, я понятия не имею, как работают эти классы. Просто пытаюсь использовать свою интуицию при создании объекта, а затем назначении атрибутов ... например, className.atribute1.attribute1 of attribute1 и т.д.
Я немного помог с ответом, но все еще печатаю.






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 и т. д.). Вы знаете какой-либо учебник с объяснением того, как создать класс с такой последовательностью?
да, я прилагаю одну ссылку, в которой есть очень хорошие руководства по использованию объектно-ориентированного подхода в python. realpython.com/python3-object-oriated-programming
@ HIMANSHU PATEL Я хочу научиться делать, например, это: ax1.xaxis.set_tick_params(labelsize=10). Вы видите, что у ax1 есть атрибут attr. xaxis, а затем xaxis имеет атрибут attr. set_tick_params. Как создать атрибут атрибута?
о, значит, вы говорите о внутреннем классе. прикрепляю ссылку ниже pythonspot.com/inner-classes
дайте мне знать, если вам понадобится дополнительная помощь. Спасибо :)
Для меня все не ново, но то, что вы пытаетесь сделать здесь, 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
Вы определили круг как метод экземпляра и обрабатываете его как атрибут класса, но ни то, ни другое не имеет смысла; не должен ли круг быть подкласс общего класса формы? Также не отменяйте
object.