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)
이에 대한 몇 가지 참고 사항 :
I declared that
Team
inherits fromobject
. 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.필수는 아니지만 이니셜 라이저에 선택적 인수를 사용하여
team
및 에서 한 것처럼 인스턴스를 한 줄로 초기화 할 수 있도록했습니다team3
. 이러한 인수는 이름이 지정되므로 위치 매개 변수로 값을 제공team
하거나 (와 같이 ) 에서와 같이argument=
양식을 사용할 수 있습니다team3
. 인수의 이름을 명시 적으로 지정할 때 임의의 순서로 인수를 지정할 수 있습니다.무언가를 확인하기 위해 getter 및 setter 함수가 필요한 경우 Python에서 특수 메서드 함수를 선언 할 수 있습니다. 이것이 Martin v. Löwis가 "속성 설명자"를 말했을 때 의미하는 바입니다. Python에서는 일반적으로 멤버 변수에 할당하고 단순히 참조하여 가져 오는 것이 좋습니다. 나중에 필요할 때 언제든지 속성 설명자를 추가 할 수 있기 때문입니다. (그리고 그것들이 전혀 필요하지 않다면, 당신의 코드는 덜 복잡해지고 작성하는 데 걸리는 시간도 줄어 듭니다. 보너스!)
다음은 속성 설명자에 대한 좋은 링크입니다. http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/
호출의 일부로 값을 지정
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
'programing' 카테고리의 다른 글
iOS 10의 푸시 알림 문제 (0) | 2021.01.05 |
---|---|
프로그래밍 방식으로 창을 최소화하는 방법이 있습니까? (0) | 2021.01.05 |
Android-OnDateChangedListener-어떻게 설정합니까? (0) | 2021.01.05 |
더 명확한 형식 : if (! value) 또는 if (flag == value)? (0) | 2021.01.05 |
비디오를 HTML5 ogg / ogv 및 mpg4로 변환 (0) | 2020.12.31 |