programing

Python에서 클래스를 정의하는 방법은 무엇입니까?

nasanasas 2021. 1. 5. 08:09
반응형

Python에서 클래스를 정의하는 방법은 무엇입니까?


아주 간단합니다. 저는 파이썬을 배우고 있으며 다음을 작성하는 방법을 알려주는 참조를 찾을 수 없습니다.

public class Team {
     private String name;
     private String logo;
     private int members;

     public Team(){}

     // getters/setters 
 }

나중:

Team team = new Team();
team.setName( "Oscar" );
team.setLogo( "http://...." );
team.setMembers( 10 );

이는 이름 / 로고 / 멤버 속성이있는 클래스 팀입니다.

편집 몇 번의 시도 후에 나는 이것을 얻었다 :

class Team:
    pass

나중

team = Team()
team.name="Oscar"
team.logo="http://..."
team.members=10

이것은 파이썬 방식입니까 ?? 이상한 느낌 (물론 강력한 유형의 언어에서 나옴)


class Team:
  def __init__(self):
    self.name = None
    self.logo = None
    self.members = 0

Python에서는 일반적으로 getter 및 setter를 작성하지 않습니다. 단, 실제로는 속성 설명자를 사용하는 사소한 구현이없는 경우가 있습니다.


내가 추천하는 것은 다음과 같습니다.

class Team(object):
    def __init__(self, name=None, logo=None, members=0):
        self.name = name
        self.logo = logo
        self.members = members

team = Team("Oscar", "http://...", 10)

team2 = Team()
team2.name = "Fred"

team3 = Team(name="Joe", members=10)

이에 대한 몇 가지 참고 사항 :

  1. I declared that Team inherits from object. This makes Team a "new-style class"; this has been recommended practice in Python since it was introduced in Python 2.2. (In Python 3.0 and above, classes are always "new-style" even if you leave out the (object) notation; but having that notation does no harm and makes the inheritance explicit.) Here's a StackOverflow discussion of new-style classes.

  2. 필수는 아니지만 이니셜 라이저에 선택적 인수를 사용하여 team에서 한 것처럼 인스턴스를 한 줄로 초기화 할 수 있도록했습니다 team3. 이러한 인수는 이름이 지정되므로 위치 매개 변수로 값을 제공 team하거나 (와 같이 ) 에서와 같이 argument=양식을 사용할 수 있습니다 team3. 인수의 이름을 명시 적으로 지정할 때 임의의 순서로 인수를 지정할 수 있습니다.

  3. 무언가를 확인하기 위해 getter 및 setter 함수가 필요한 경우 Python에서 특수 메서드 함수를 선언 할 수 있습니다. 이것이 Martin v. Löwis가 "속성 설명자"를 말했을 때 의미하는 바입니다. Python에서는 일반적으로 멤버 변수에 할당하고 단순히 참조하여 가져 오는 것이 좋습니다. 나중에 필요할 때 언제든지 속성 설명자를 추가 할 수 있기 때문입니다. (그리고 그것들이 전혀 필요하지 않다면, 당신의 코드는 덜 복잡해지고 작성하는 데 걸리는 시간도 줄어 듭니다. 보너스!)

    다음은 속성 설명자에 대한 좋은 링크입니다. http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/

  4. 호출의 일부로 값을 지정 Team()하거나 나중에 클래스 인스턴스에 값을 넣는 것은 중요하지 않습니다 . 최종 클래스 인스턴스는 동일합니다.

team = Team("Joe", "http://example.com", 1)
team2 = Team()
team2.name = "Joe"
team2.logo = "http://example.com"
team2.members = 1

print team.__dict__ == team2.__dict__

The above will print True. (You can easily overload the == operator for Team instances, and make Python do the right thing when you say team == team2 but this doesn't happen by default.)


EDIT: I left out one thing in the above answer, and I'd like to add it now. If you do the optional argument thing on the __init__() function, you need to be careful if you want to provide a "mutable" as an optional argument.

Integers and strings are "immutable". You can never change them in place; what happens instead is Python creates a new object and replaces the one you had before.

Lists and dictionaries are "mutable". You can keep the same object around forever, adding to it and deleting from it.

x = 3   # the name "x" is bound to an integer object with value 3
x += 1  # the name "x" is rebound to a different integer object with value 4

x = []  # the name "x" is bound to an empty list object
x.append(1)  # the 1 is appended to the same list x already had

The key thing you need to know: optional arguments are evaluated only once, when the function is compiled. So if you pass a mutable as an optional argument in the __init__() for your class, then each instance of your class shares one mutable object. This is almost never what you want.

class K(object):
    def __init__(self, lst=[]):
        self.lst = lst

k0 = K()
k1 = K()

k0.lst.append(1)

print k0.lst  # prints "[1]"
print k1.lst  # also prints "[1]"

k1.lst.append(2)

print k0.lst  # prints "[1, 2]"

The solution is very simple:

class K(object):
    def __init__(self, lst=None):
        if lst is None:
            self.lst = []  # bind lst with a new, empty list
        else:
            self.lst = lst # bind lst with provided list

k0 = K()
k1 = K()

k0.lst.append(1)

print k0.lst  # prints "[1]"
print k1.lst  # print "[]"

This business of using a default argument value of None, then testing that the argument passed is None, qualifies as a Python design pattern, or at least an idiom you should master.

ReferenceURL : https://stackoverflow.com/questions/1495666/how-to-define-a-class-in-python

반응형