파이썬, 객체 생성


132

나는 파이썬을 배우려고 노력하고 있으며 지금은 수업을 중단시키고 인스턴스로 클래스를 조작하는 방법을 배우려고합니다.

이 연습 문제를 이해하지 못하는 것 같습니다.

이름, 나이 및 전공이 입력과 동일한 학생 객체를 만들어 반환

def make_student(name, age, major)

객체에 의해 의미하는 바를 얻지 못합니다.이 값을 보유하는 함수 내에 배열을 만들어야한다는 의미입니까? 또는 클래스를 만들고이 함수를 내부에 배치하고 인스턴스를 할당합니까? (이 질문 전에 나는 이름, 나이 및 전공을 가진 학생 클래스를 설정하도록 요청 받았다)

class Student:
    name = "Unknown name"
    age = 0
    major = "Unknown major"

데이터 모델 문서를 읽으십시오. 특히 __init__방법은 여기에 관련이 있습니다 : docs.python.org/2/reference/datamodel.html#object.__init__
wim

1
파이썬에서 할당되지 않은 일반적인 기본값 은 없습니다 (따옴표 없음)
monkut

답변:


173
class Student(object):
    name = ""
    age = 0
    major = ""

    # The class "constructor" - It's actually an initializer 
    def __init__(self, name, age, major):
        self.name = name
        self.age = age
        self.major = major

def make_student(name, age, major):
    student = Student(name, age, major)
    return student

파이썬 철학의 원칙 중 하나가 "하나의 명백한 방법이 있어야한다" 는 것이지만 , 이를 수행하는 방법은 여전히 ​​여러 가지가 있습니다. 다음 두 코드 조각을 사용하여 Python의 동적 기능을 활용할 수도 있습니다.

class Student(object):
    name = ""
    age = 0
    major = ""

def make_student(name, age, major):
    student = Student()
    student.name = name
    student.age = age
    student.major = major
    # Note: I didn't need to create a variable in the class definition before doing this.
    student.gpa = float(4.0)
    return student

전자를 선호하지만 후자가 유용 할 수있는 인스턴스가 있습니다. 하나는 MongoDB와 같은 문서 데이터베이스로 작업 할 때 유용합니다.


17
왜 초기화하기 전에 클래스 변수로 초기화합니까? (호기심; 그 패턴을 자주 보지 못했습니다)
GoingTharn

7
가독성을 위해. 초기화하기 전에 클래스 변수를 맨 위에두면 생성자가 설정하지 않았을 수 있으므로 클래스 범위에있는 변수를 빠르게 확인할 수 있습니다.
Wulfram

1
여기서 Student 클래스의 인스턴스 인 객체의 이름은 학생 권리로 남을 것입니까? 이름이 student01, student02, .. 등인 각 호출에서 여러 객체를 원하면 어떻게합니까?
Yathi

9
클래스 변수를 생성하여 인스턴스 변수가 끔찍한 방법인지 확인하십시오. 초보자 독자에게는 @pyrospade의 대답을 대신보십시오.
anon01

2
당신의 모범은 오도합니다. 각 학생의 속성을 오용하는 것이 아니라 실제로 모든 학생의 속성 인 클래스 변수 이름을 사용하십시오. 예를 들어 사용 class Unicorn하고 has_hooves = True대신 name = "".
Tim Kuipers

49

클래스를 작성하고 메소드를 제공하십시오 __init__.

class Student:
    def __init__(self, name, age, major):
        self.name = name
        self.age = age
        self.major = major

    def is_old(self):
        return self.age > 100

이제 Student클래스 의 인스턴스를 초기화 할 수 있습니다 :

>>> s = Student('John', 88, None)
>>> s.name
    'John'
>>> s.age
    88

make_student와 같은 일을하는 경우 왜 학생 기능 이 필요한지 잘 모르겠습니다 Student.__init__.


우리 선생님은 우리가 문제를 올바르게했는지 테스트하는 test.py 프로그램을주었습니다. 질문은 특별히 make_student 함수를 사용하기를 원합니다. 최종 목표는 다음과 같습니다. s1 = make_student (name, age, major) 그리고 이제 모든 것이 s1에 할당되었습니다. 그러나 다시 나는 그들이 s1이 무엇을 원하는지 확신하지 못합니까? 배열 { 'name': name..etc}를 사용하여이 작업을 수행 할 수 있지만, 정답을 얻지 못했기 때문에 클래스와 인스턴스에서 배운 내용을 구현해야한다고 가정합니다.
Mohsen M. Alrasheed

1
코드에서 직접 작성하는 대신 어떤 종류의 객체를 작성하기 위해 메소드 또는 함수를 사용하는 소위 "팩토리 메소드"패턴은 유용한 패턴입니다. 예를 들어 상속에 관한 멋진 것을 활용할 수 있습니다. . 그것을 봐;)
bracco23

28

객체는 클래스의 인스턴스입니다. 클래스는 단지 객체의 청사진입니다. 클래스 정의가 주어지면-

# Note the added (object) - this is the preferred way of creating new classes
class Student(object):
    name = "Unknown name"
    age = 0
    major = "Unknown major"

당신은 만들 수 있습니다 make_student명시 적으로 새로운 인스턴스에 속성을 할당하여 기능을 Student-

def make_student(name, age, major):
    student = Student()
    student.name = name
    student.age = age
    student.major = major
    return student

그러나 아마도 생성자 ( __init__) 에서 이것을하는 것이 더 합리적입니다.

class Student(object):
    def __init__(self, name="Unknown name", age=0, major="Unknown major"):
        self.name = name
        self.age = age
        self.major = major

를 사용할 때 생성자가 호출됩니다 Student(). __init__메소드에 정의 된 인수를 사용합니다 . 생성자 서명은 이제 본질적으로Student(name, age, major) 입니다.

그것을 사용하면 make_student함수는 사소하고 불필요합니다.

def make_student(name, age, major):
    return Student(name, age, major)

재미를 위해 make_student클래스를 정의하지 않고 함수 를 작성하는 방법에 대한 예가 있습니다 . 집에서 시도하지 마십시오.

def make_student(name, age, major):
    return type('Student', (object,),
                {'name': name, 'age': age, 'major': major})()

실제로, 나는 클래스 이름 (객체)을하지 않는 것을 선호합니다 : 자세한 설명을 위해. 파이썬 문서는 그것을하지 않는 경향이 있습니다. 나는 dict에 먹이를주는 "위험한"예를 좋아합니다. docs.python.org/2/tutorial/classes.html
Wulfram

1
이전 의견을 철회합니다. stackoverflow.com/questions/4015417/…를 참조하십시오 . 따라서 실제로 클래스 이름 (오브젝트)을 설명 할 이유가 있습니다.
Wulfram

1
파이썬에는 생성자가 없습니다 :)
BigSack

: 방법이다 __init__()생성자에서 방법의 다른는?
열분해

1
__init__"이때 객체가 이미 생성되어 __init__호출 되었기 때문에 이미 클래스의 새 인스턴스에 대한 유효한 참조 가 있기 때문에 생성자가 아닙니다 ." ( diveintopython.net/object_oriented_framework/… )
Brian Z

3

사전 정의 클래스를 사용하여 객체를 생성 할 때는 먼저 해당 객체를 저장하기위한 변수를 생성하려고합니다. 그런 다음 생성 한 객체 및 저장 변수를 만들 수 있습니다.

class Student:
     def __init__(self):

# creating an object....

   student1=Student()

실제로이 init 메소드는 클래스의 생성자입니다. 일부 속성을 사용하여 해당 메소드를 초기화 할 수 있습니다.이 시점에서 객체를 작성할 때 특정 속성에 대한 일부 값을 전달해야합니다.

class Student:
      def __init__(self,name,age):
            self.name=value
            self.age=value

 # creating an object.......

     student2=Student("smith",25)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.