Найти - Пользователи
Полная версия: Как описать метод класса отдельным файлом?
Начало » Python для новичков » Как описать метод класса отдельным файлом?
1
lavrton
Описать метод отдельно обычно можно так:
#file2.py
def show(self, string):
print string

#file1.py
from file2 import show
class A:
show=show

a=A()
a.show('hello')
А если есть такая конструкция:

class shape:
def show(self):
print 'shape'

@staticmethod
def makeRec():
rec=Rectangle()
return rec

class Rectangle(shape):
def show(self):
shape.show(self)
print 'rectangle'

rectangle=shape.makeRec()
rectangle.show()
Она тоже работает хорошо, но каждый из методов я не смогу описать в отдельных файлах. Если это сделать получится класс shape импортирует метод makeRec, которому нужен класс Rectangle, в котором импортируется метод show, в котором СНОВА нужен класс shape. Запутанно конечно.. Короче так:

#shape.py
from show import show
from makeRec import makeRec
class shape:
show=show
staticmethod(makeRec)

#show.py
def show(self):
print 'shape'

#makeRec.py
from rectangle import Rectangle
def makeRec():
rec=Rectangle()
return rec

#rectangle.py
from shape import shape
from showrec import show
class Rectangle(shape):
show=show

#showrec.py
from shape import shape
def show(self):
shape.show(self)
print 'rectangle'
Работать не будет из-за циклического импортирования


В общем цель описать КАЖДУЮ сущность (класс, метод) в отдельном файле. Как это сделать в такой ситуации?
Андрей Светлов
Кажется, вам нужно что-то совсем другое, отличное от разнесения кода по отдельным классам.

Расскажите, что?
Пример на простой предметной области, изложенный обыкновенным русским языком - сильно помогает пониманию.
o7412369815963
можно разорвать цикл., а связи построить при запуске программы.
например для класса Rectangle наследование прикрутить при запуске программы или в метод makeRec вызов rectangle() при запуске засунуть.

но это извращение.
lavrton
Андрей Светлов, Мне нужно описать с помощью ООП геометрические фигуры. Второй пример кода, с моей точки зрения очень хорош.

В компилируемых языках есть понятие “единица компиляции”, по суть это один файл исходного кода. Если методы очень большие их лучше описывать в отдельных файлах. Это удобно по множеству причин. Подобный код в с++ я без проблем могу разнести в разные файлы, использую файлы заголовков.
В python'е не получается. Может я не правильно проектирую методы?

Как можно разнести по отдельным файлам сущности такого кода? (in - функция ввода out - функция вывода)
# -*- coding: utf-8 -*-
#from shape_in import In
from shape_out import Out

from circle_in import In as InC
from circle_out import Out as OutC

from rectangle_in import In as InR
from rectangle_out import Out as OutR

colorDict={'1':'красный', '2': 'зелёный', '3': 'синий'}

existShapes=[1,2]
class Shape():
def __init__(self):
self.key=''
self.color=''
self.oblect=None

Out=Out
@staticmethod
def In(inputStr):
ParamsList=inputStr.split(' ')
i=int(ParamsList[0])
if i not in existShapes:
return False
if i==1:
# self.key='circle'
shape=Circle()
shape.InData(' '.join(ParamsList[2:]))
elif i==2:
# shape.key='rectangle'
shape=Rectangle()
shape.InData(' '.join(ParamsList[2:]))
if ParamsList[1] in colorDict.keys():
shape.color=colorDict[ParamsList[1]]
return shape

def InData(self):
pass

class Circle(Shape):
def __init__(self,x=0,y=0,radius=0):
self.x=x
self.y=y
self.radius=radius
InData=InC
Out=OutC

class Rectangle(Shape):
def __init__(self,x1=0,y1=0,x2=1,y2=1):
self.x1=x1
self.y1=y1
self.x2=x2
self.y2=y2

InData=InR
# Out=OutR
def Out(self,outstream):
Shape.Out(self,outstream)
# super( Shape, self ).Out( *args )
outstream.write("Это примоугольник: x1 = "+str(self.x1)+' ,y1 = '+str(self.y1)+' ,x2 = '+str(self.x2)+' ,y2 = '+str(self.y2)+'.\n')
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB