2011-01-18 3 views
3

런타임 중에 객체를 생성 할 때 OOP 개념을 파악하는데 문제가 있습니다. 내가 조사한 모든 교육 코드는 특정 변수를 정의합니다. 'Bob'을 만들고 새 객체 인스턴스에 지정합니다. Bob = Person()Python 런타임에서 객체 생성하기

지금 내가 이해하는 데 문제가되는 것은 런타임 중에 새 객체를 만드는 모델을 디자인하는 방법입니다. 나는 런타임 동안 모든 객체가 생성 되었기 때문에 내 말씨가 잘못되었을 수도 있다는 것을 알고 있지만, 말하자면 터미널이나 UI에서 내 애플리케이션을 시작하면 새로운 객체를 만들고 관리 할 수있다. 나는 정말로 새로운 변수 이름을 즉시 정의 할 수는 없습니까?

이 디자인 문제를 다루는 예제 애플리케이션은 사람들을 저장하는 데이터베이스입니다. 사용자는 새로운 사용자를 만들고 이름, 급여, 직위를 지정할 수있는 터미널 메뉴를 얻습니다. 어떻게 그 객체를 인스턴스화하고 나중에 객체를 관리하고 함수를 호출 할 때 호출 할 것입니까? 여기에 디자인 패턴은 무엇입니까?

OPP 모델을 잘 이해하지 못했습니다. 나는 현재 수업과 OOP에서 읽고 있지만, 나는 내가 계속 나아 가기 전에 나의 오류가 무엇인지 이해할 필요가 있다고 느낀다. 내가 분명히해야 할 것이 있으면 알려주세요. 목록이나 사전 같은

+0

왜 맞춤 이름을 변수 이름으로 사용 하시겠습니까? – SilentGhost

+0

실제로 개체를 만드는 것을 이해했습니다. 먼저 목록, 세트 및 사전과 같은 컨테이너에 대해 자세히 알아야합니다. –

+2

누군가가 "이름"을 말할 때마다, 나는 '혼란의 아이디어'태그를 추가해야한다는 강한 충동을 느낀다;) 객체는 이름이 없다. 변수가 있으며 객체를 참조합니다. 그러나 이것은 1 : 1 관계가 아닙니다. 많은 변수가 하나의 객체를 참조 할 수 있으며 객체는 변수에 의해 참조 될 필요가 없습니다. 그들은 매우 별개의 것들입니다. – delnan

답변

7

물건 값/객체의 동적으로 생성 된 세트를 저장하기위한 훌륭한 있습니다 : 귀하의 예를 들어

class Person(object): 
    def __init__(self, name): 
     self.name = name 
    def __repr__(self): 
     print "A person named %s" % self.name 

people = {} 
while True: 
    print "Enter a name:", 
    a_name = raw_input() 

    if a_name == 'done': 
     break 

    people[a_name] = Person(a_name) 

    print "I made a new Person object. The person's name is %s." % a_name 

print repr(people) 
+1

놀라운, 정말 고마워. –

1

, 당신은 모델 추상화를 사용하고 싶습니다. Person는 모델 클래스 인 경우

, 당신은 간단하게 할 수있는 :

person = new Person() 
person.name = "Bob" 
person.email = "[email protected]" 
person.save() # this line will write to the persistent datastore (database, flat files, etc) 

다음 다른 세션에서, 당신은 할 수 :

person = Person.get_by_email("[email protected]") # assuming you had a classmethod called 'get_by_email' 
+0

참고 사례를 제공해 주셔서 감사합니다. 나는 이것이 다음과 같이 보일 것이라고 생각했다. –

2

당신은 변수 이름을 가진 각 개체를 저장하지 않습니다 . 변수 이름은 프로그래머의 편의를위한 것입니다.

개체 컬렉션을 원하면 컬렉션 만 사용하십시오. index 또는 key로 각각 참조되는 객체 인스턴스를 포함하는 목록 또는 사전을 사용하십시오.

예를 들어, 각 직원이 직원 번호를 갖고있는 경우 직원 번호가 키 인 사전에 보관할 수 있습니다.

+0

나는 그것이 사실 일 것이라고 예감했다. 설명에 감사하고, 매우 도움이되었다. –

1

나는 최선 내가 여기서 할 수있는 대답을하려고합니다 : 당신이 무슨 요구하는지 무엇

  1. 변수 변수 이름 - 이것은 파이썬에 있지 않습니다.

사용자는 그에게 새로운 사용자를 생성하고 이름, 급여, 위치를 할당 할 수 있습니다 터미널 메뉴를 얻는다 (나는 VB.Net에서의 생각 하지만 저를 보유하지 않습니다). 어떻게 그 객체를 인스턴스화하고 나중에 객체를 관리하고 함수를 호출 할 때 호출 할 것입니까? 여기에 디자인 패턴은 무엇입니까?

이 내가 (미키 마우스 예) 새로운 사람을 추가 할 것입니다 방법입니다

# Looping until we get a "fin" message 
while True: 
    print "Enter name, or "fin" to finish:" 
    new_name = raw_input() 
    if new_name == "fin": 
     break 
    print "Enter salary:" 
    new_salary = raw_input() 
    print "Enter position:" 
    new_pos = raw_input() 

    # Dummy database - the insert method would post this customer to the database 
    cnn = db.connect() 
    insert(cnn, new_name, new_salary, new_pos) 
    cnn.commit() 
    cnn.close() 

좋아, 그래서 당신은 이제 데이터베이스에서 사람을 싶어.

while True: 
    print "Enter name of employee, or "fin" to finish:" 
    emp_name = raw_input() 
    if emp_name == "fin": 
     break 
    # Like above, the "select_employee" would retreive someone from a database 
    cnn = db.connect() 
    person = select_employee(cnn, emp_name) 
    cnn.close() 

    # Person is now a variable, holding the person you specified: 
    print(person.name) 
    print(person.salary) 
    print(person.position) 

    # It's up to you from here what you want to do 

이것은 단지 기본적인 거친 예제이지만, 나는 당신이 의미하는 바를 얻었을 것이라고 생각합니다.

또한 알 수 있듯이 나는 이 아니며 클래스를 사용합니다. 이런 식의 클래스는 항상 더 나은 아이디어가 될 것입니다. 그러나 이는 런타임 중에 변수를 변경하고 사용하는 방법을 보여주기위한 것입니다.

0

실제 프로그램에서는 결코 Bob = Person()을 사용하지 않을 것입니다. 틀림없이 나쁜 예를 보여주는 모든 예제; 본질적으로 하드 코딩입니다. 더 자주 (실제 코드로) person = Person(id, name) 같은 것을하거나 다른 곳에서 얻은 데이터를 사용하여 객체를 구성 할 수 있습니다 (파일에서 읽거나 대화식으로 사용자로부터받은 등). 더 나은 것은 employee = Person(id, name)과 같은 것입니다.