저는 XLS/XLSX/CSV 스프레드 시트와 상호 작용하는 데 사용되는 파이썬 스크립트 작업을하고 있습니다.파이썬에서 3 단계 깊이로 클래스를 중첩하는 것은 나쁜 습관입니까?
- 차
Workbook
분류 : 서로에 중첩되는 세 가지 주요 클래스세 기본 클래스
아래 설명된다 (서로 연장 하지는 클래스가 다른 클래스 내에 그대로이다)이있다 이것은 XLS/XLSX/CSV 클래스의 팩토리 메서드입니다. 외부 액세스 가능 - 파일 내에서 특정 스프레드 시트 나 워크 시트를 여는 데 사용되는
Workbook
클래스의__Worksheet
클래스 전용 클래스입니다. 이것은Workbook.worksheet()
방법을 통해서만 접근 가능합니다 __Worksheet
클래스의 개인__Cell
클래스는 셀 자체와 상호 작용합니다. 이것은 외부__Worksheet
클래스 Heres는
지금까지 클래스 구조의 단순화 된 버전을 통해 오히려에서만 액세스 할 수 액세스 할 수 없게해야합니다
class Workbook(object):
def __init__(self, file_name):
self.__file_name = file_name
def worksheet(self, name):
return self.__Worksheet(self, name)
class __Worksheet():
def __init__(self, workbook, worksheet):
self.__workbook = workbook
def cell(self, cell_id, data = None):
return self.__Cell(cell_id, data)
class __Cell():
def __init__(self, cell, data = None):
self.__cell = cell
self.__data = data
def setVal(self, data):
self.__data = data
def __str__(self):
return self.__data
workbook = Workbook('test-file.csv')
worksheet = workbook.worksheet('First Worksheet')
cell_A1 = worksheet.cell('A1', 'Foo...')
print("Before - Cell A1: %s" % cell_A1) # => Before - Cell A1: Foo...
cell_A1.setVal('Bar...')
print("After - Cell A1: %s" % cell_A1) # => Before - After - Cell A1: Bar...
그래서 내가 가지고있는 질문은 - 나쁜 생각인가 수업 시간에 수업을 듣는 연습을하십니까?
저는 약간 파이썬에 익숙하지 않지만, 제 경험은 대부분 PHP/JS/Perl입니다. 파이썬에서 클래스 내에서 클래스를 가지는 것은 너무 드문 것처럼 보이지만, 어떤 이유로 클래스 3 레벨을 중첩하는 것은 잘못된 것처럼 보입니다. 그것이 있다면, 그리고 그것을 할 수있는 더 좋은 방법이 있다면, 그것은 좋을 것입니다.
나는 대안 하지 중첩 클래스 알고, 그리고 Workbook
의 인스턴스가 매개 변수로 Worksheet
에 주어진다면 바로 확인. 그런 다음 Worksheet
인 경우 인스턴스를 반환하는 에 메소드를 생성하고 시작하는 데 사용되는 매개 변수 중 하나로 self
을 전달합니다.
예 :
class Workbook(object):
def __init__(self, file_name):
self.__file_name = file_name
def worksheet(self, name):
return self.Worksheet(self, name)
class Worksheet(object):
def __init__(self, workbook, worksheet = 0):
if not isinstance(workbook, Workbook):
raise Exception('Expected the workbook to be an instance of the Workbook class')
self.__workbook = workbook
def cell(self, cell_id, data = None):
return self.Cell(cell_id, data)
class Cell(object):
def __init__(self, worksheet, cell, data = None):
if not isinstance(worksheet, Worksheet):
raise Exception('Expected the worksheet to be an instance of the Worksheet class')
self.__cell = cell
self.__data = data
def setVal(self, data):
self.__data = data
def __str__(self):
return self.__data
# Example Usage One
workbook = Workbook('test-file.xls')
worksheet = workbook.worksheet('First Worksheet')
cell_A1 = worksheet.cell('A1', 'Foo...')
print("Before - Cell A1: %s" % cell_A1) # => Before - Cell A1: Foo...
cell_A1.setVal('Bar...')
print("After - Cell A1: %s" % cell_A1) # => Before - After - Cell A1: Bar...
# Example Usage Two
workbook = Workbook('test-file.xlsx')
worksheet = Worksheet(workbook, 'First Worksheet')
cell_A1 = Cell(worksheet, 'A1', 'Foo...')
print("Before - Cell A1: %s" % cell_A1) # => Before - Cell A1: Foo...
cell_A1.setVal('Bar...')
print("After - Cell A1: %s" % cell_A1) # => Before - After - Cell A1: Bar...
# Failed Example
worksheet = Worksheet('Not worksheet', 1) # => Exception, as expected
그러나이 대안은 Worksheet
및 Cell
클래스 외부에서 액세스 할 수 있으며 수동으로 시작할 수 있습니다 ...하지만 내가하지 끔찍한 일 그게 전부 추측 것을 의미한다.
가장 좋은 방법은 무엇이라고 생각하는지 알려주세요. 이 게시물에 댓글 하나는 another SO post에 대한 링크를 제공하는 첫 번째있는 사용자 게시물 중첩 클래스의 3 장점 :
클래스의 논리적 그룹 : 클래스는 하나의 유용한 경우 다른 클래스의 경우 클래스에 해당 클래스를 포함시키고 두 클래스를 함께 유지하는 것이 논리적입니다. 이러한 "헬퍼 클래스"를 중첩하면 패키지가보다 간결 해집니다.
내가 정확히 생각한 것입니다. 나는 단지 2를하기 전에 그것들을 3 개의 레이어에 중첩시키는 것이 다소 어색하다고 생각했습니다.
"다음과 같은 행을 포함 시키면 충분합니다. 그러면 더 좋은 방법이 될 것입니다."- 그렇지 않습니까? – BartoszKP
왜 그랬겠습니까? 모듈 레벨을 모두 모듈화하는 것과 비교하면 어떤 이점도 얻지 못합니다. – user2357112
[나는 나쁜 행동이라고 생각하지 않는다] (http://stackoverflow.com/questions/719705/what-is-the-purpose-of-pythons-inner-classes). –