Python 클래스에서 __init__를 사용하는 이유는 무엇입니까?
수업의 초기화를 이해하는 데 어려움을 겪고 있습니다.
그것들의 요점은 무엇이고 우리는 그것들에 무엇을 포함해야 하는지 어떻게 알 수 있습니까?수업 시간에 글을 쓰는 것은 기능을 만드는 것과 다른 사고 방식을 요구합니까? (저는 기능을 만든 다음 다시 사용할 수 있도록 수업 시간에 그것들을 포장하면 된다고 생각했습니다.효과가 있을까요?)
예는 다음과 같습니다.
class crawler:
# Initialize the crawler with the name of database
def __init__(self,dbname):
self.con=sqlite.connect(dbname)
def __del__(self):
self.con.close()
def dbcommit(self):
self.con.commit()
또는 다른 코드 샘플:
class bicluster:
def __init__(self,vec,left=None,right=None,distance=0.0,id=None):
self.left=left
self.right=right
self.vec=vec
self.id=id
self.distance=distance
요가 있는 이 정말 .__init__
나는 다른 사람의 코드를 읽으려고 할 때 우연히 발견되지만, 그들을 만드는 논리를 이해하지 못합니다.
당신이 쓴 글을 보면, 당신은 중요한 이해의 한 부분을 놓치고 있습니다: 클래스와 객체 사이의 차이입니다.__init__
클래스를 초기화하는 것이 아니라 클래스 또는 개체의 인스턴스를 초기화합니다.개마다 색깔이 있지만 학급의 개들은 그렇지 않습니다.각각의 개는 4개 혹은 그보다 적은 발을 가지고 있지만, 그 종류의 개들은 그렇지 않습니다.클래스는 개체의 개념입니다.당신이 Fido와 Spot을 보면, 당신은 그들의 유사성과 그들의 개의 선함을 알 수 있습니다.바로 그런 수업입니다.
당신이 말할때
class Dog:
def __init__(self, legs, colour):
self.legs = legs
self.colour = colour
fido = Dog(4, "brown")
spot = Dog(3, "mostly yellow")
Fido는 다리가 4개인 갈색 개이고 Spot은 약간의 장애가 있고 대부분 노란색입니다.__init__
함수를 생성자 또는 initializer라고 하며, 클래스의 새 인스턴스를 만들 때 자동으로 호출됩니다.이 변수self
이..self.legs
입니다라는 입니다.legs
self
할 수 있는 한 동작)을 속성은 일종의 변수이지만 개체의 상태나 개체가 사용할 수 있는 특정한 동작(함수)을 설명합니다.
하지만, 당신이 설정하지 않았다는 것을 주목하세요.colour
그것은 추상적인 개념입니다.수업에서 의미가 있는 속성들이 있습니다.를 들면어.population_size
피도는 항상 하나이기 때문에 피도를 세는 것은 말이 되지 않습니다.개를 세는 것은 말이 됩니다.전 세계에 2억 마리의 개가 있다고 가정해 보겠습니다.도그 클래스의 소유물입니다.Fido는 2억이라는 숫자와 아무 관련이 없고 Spot도 관련이 없습니다.성"닌 성"이라고 합니다.colour
아니면legs
에.
이제, 개는 덜하고 프로그래밍과 관련된 것으로.아래에 적는 것처럼, 추가할 수업은 센스가 없습니다. 어떤 수업인가요?Python의 클래스는 유사하게 동작하는 다양한 데이터 모음으로 구성됩니다.개의 종류는 Fido와 Spot 그리고 1999999998 그들과 비슷한 다른 동물들로 구성되어 있고, 그들은 모두 가로등에 오줌을 쌌습니다.물건을 추가하는 수업은 무엇으로 구성되어 있습니까?이들은 어떤 데이터에 따라 다른가요?그리고 그들은 어떤 행동을 공유합니까?
하지만 숫자는...그것들은 더 흥미로운 주제입니다.예, 정수.개들보다 훨씬 더 많아요Python에 정수가 이미 있다는 것을 알고 있지만, 바보처럼 놀고 다시 "구현"해 봅시다(Python의 정수를 속이고 사용함).
정수는 하나의 클래스입니다.그들은 몇 가지 데이터(값)와 몇 가지 행동("나를 이 다른 숫자에 추가")을 가지고 있습니다.다음을 보여드리겠습니다.
class MyInteger:
def __init__(self, newvalue):
# imagine self as an index card.
# under the heading of "value", we will write
# the contents of the variable newvalue.
self.value = newvalue
def add(self, other):
# when an integer wants to add itself to another integer,
# we'll take their values and add them together,
# then make a new integer with the result value.
return MyInteger(self.value + other.value)
three = MyInteger(3)
# three now contains an object of class MyInteger
# three.value is now 3
five = MyInteger(5)
# five now contains an object of class MyInteger
# five.value is now 5
eight = three.add(five)
# here, we invoked the three's behaviour of adding another integer
# now, eight.value is three.value + five.value = 3 + 5 = 8
print eight.value
# ==> 8
은 좀 깨지기 는 를 하고 있습니다other
MyInteger)이 되겠지만 이제는 무시하겠습니다.실제 코드에서는 그렇지 않습니다. 확실히 하기 위해 테스트하고, 심지어 강요할 수도 있습니다("당신은 정수가 아닌가요?").세상에, 당신은 하나가 되기 위해 10나노초가 필요합니다! 9... 8...")
분수를 정의할 수도 있습니다.분수는 자신을 추가하는 방법도 알고 있습니다.
class MyFraction:
def __init__(self, newnumerator, newdenominator):
self.numerator = newnumerator
self.denominator = newdenominator
# because every fraction is described by these two things
def add(self, other):
newdenominator = self.denominator * other.denominator
newnumerator = self.numerator * other.denominator + self.denominator * other.numerator
return MyFraction(newnumerator, newdenominator)
정수보다 분수가 훨씬 더 많습니다(실제로는 아니지만 컴퓨터는 그것을 모릅니다).두 가지를 만들어 봅시다.
half = MyFraction(1, 2)
third = MyFraction(1, 3)
five_sixths = half.add(third)
print five_sixths.numerator
# ==> 5
print five_sixths.denominator
# ==> 6
여기서 사실 아무 것도 선언하지 않으셨군요.속성은 새로운 종류의 변수와 같습니다.정규 변수에는 하나의 값만 있습니다.자를 .colour = "grey"
이 인 수 없습니다.colour
은."fuchsia"
-다
어레이를 통해 어느 정도 해결할 수 있습니다. 말씀하시면.colour = ["grey", "fuchsia"]
0 ( 0 로 1) 할 수 있습니다.
속성은 개체에 바인딩된 변수입니다.와 마찬가지로 데이터를 할 수 colour
개마다 변수가 있어요 그래서,fido.colour
이지만,spot.colour
또 다른. 첫 는 변수 첫 번째 개체는 변수 내의 개체에 바인딩됩니다 내의 .fido
,spot
전화하면 , Dog(4, "brown")
, 아니면three.add(five)
항상 않는 맨됩니다.하며, 됩니다.다라고 .self
점 의 값을 입니다.로 에 있는에서.__init__
(construct 또는),self
서에 안에서 가 될 입니다.MyInteger
의add
,self
는 .three
.따라서,three.value
입니다 될입니다.add
,~하듯이self.value
내에add
.
가 만약에.the_mangy_one = fido
하겠습니다로 알려진 하겠습니다.fido
다른 이름으로지금부터.fido.colour
입니다와 입니다.the_mangy_one.colour
.
, .__init__
의 출생증명서에 을 라고 생각할 수colour
그 자체가 임의의 변수이고, 무엇이든 포함할 수 있습니다.fido.colour
아니면self.colour
다.__init__
직원이 처음으로 작성하는 겁니다.
더 이상은?
EDIT: 아래 댓글에서 확장하기:
물건 목록 말씀하시는 거죠?
fido
사실은 물체가 아닙니다.입니다이라고 할 로 현재되어 있는 x = 5
,x
는 현재 숫자 5를 포함하고 있는 변수입니다.도 할 수 .fido = Cat(4, "pleasing")
상)Cat
및 ).fido
고양이 물건을 "포함"했을 겁니다네가 한다면.fido = x
되지 않을 것입니다 입니다 를이고 5 입니다.
클래스를 추적하기 위해 코드를 구체적으로 작성하지 않는 한 클래스 자체는 인스턴스를 알 수 없습니다.예를 들어 다음과 같습니다.
class Cat:
census = [] #define census array
def __init__(self, legs, colour):
self.colour = colour
self.legs = legs
Cat.census.append(self)
여기서,census
입니다의 입니다.Cat
급
fluffy = Cat(4, "white")
spark = Cat(4, "fiery")
Cat.census
# ==> [<__main__.Cat instance at 0x108982cb0>, <__main__.Cat instance at 0x108982e18>]
# or something like that
당신은 이해하지 못할 것입니다.[fluffy, sparky]
은 단지 인 이름들일 그것들은 단지 변수 이름일 뿐입니다.을 갖도록 면,에,__str__
이 이름을 반환하는 메서드입니다.는,로)와입니다.add
아니면__init__
할 때와 목적은 개체를 출력할 때와 같이 문자열로 변환하는 방법을 설명하는 것입니다.
아마단의 철저한 설명에 나의 5센트를 기부하기 위해서입니다.
여기서 클래스는 추상적인 방식으로 "유형"을 설명합니다.사물은 그들의 깨달음, 즉 살아 숨쉬는 것입니다.사물 지향적인 세계에서는 모든 것의 본질이라고 부를 수 있는 주요 아이디어들이 있습니다.다음과 같습니다.
- 캡슐화(자세히 설명하지 않음)
- 상속.
- 다형성
개체에는 하나 이상의 특성(= 속성)과 동작(= 방법)이 있습니다.동작은 대부분 특성에 따라 달라집니다.클래스는 일반적인 방법으로 행동이 달성해야 할 것을 정의하지만, 클래스가 객체로 실현되지 않는 한(인스턴트된) 가능성에 대한 추상적인 개념으로 남아 있습니다."상속"과 "다형주의"의 도움으로 설명하겠습니다.
class Human:
gender
nationality
favorite_drink
core_characteristic
favorite_beverage
name
age
def love
def drink
def laugh
def do_your_special_thing
class Americans(Humans)
def drink(beverage):
if beverage != favorite_drink: print "You call that a drink?"
else: print "Great!"
class French(Humans)
def drink(beverage, cheese):
if beverage == favourite_drink and cheese == None: print "No cheese?"
elif beverage != favourite_drink and cheese == None: print "Révolution!"
class Brazilian(Humans)
def do_your_special_thing
win_every_football_world_cup()
class Germans(Humans)
def drink(beverage):
if favorite_drink != beverage: print "I need more beer"
else: print "Lecker!"
class HighSchoolStudent(Americans):
def __init__(self, name, age):
self.name = name
self.age = age
jeff = HighSchoolStudent(name, age):
hans = Germans()
ronaldo = Brazilian()
amelie = French()
for friends in [jeff, hans, ronaldo]:
friends.laugh()
friends.drink("cola")
friends.do_your_special_thing()
print amelie.love(jeff)
>>> True
print ronaldo.love(hans)
>>> False
어떤 특성들은 인간을 정의합니다.하지만 국적마다 다소 차이가 있습니다.그래서 "국민형"은 엑스트라를 가진 인간입니다."미국인"은 "인간"의 한 종류이며, 인간 유형(베이스 클래스)으로부터 추상적인 특성과 행동을 물려받습니다. 그것이 바로 상속입니다.그래서 모든 인간은 웃고 마실 수 있고, 따라서 모든 어린이 계층도 웃을 수 있습니다!상속(2).
그러나 이들은 모두 같은 종류이기 때문에(타입/베이스 클래스:휴먼) 때로는 교환할 수 있습니다. 마지막에 있는 for-loop을 참조하십시오.그러나 그들은 개인적인 특징을 드러낼 것이고, 그것은 다형성(Polymorphism) (3)입니다.
그래서 각각의 사람들은 좋아하는 음료를 가지고 있지만, 모든 국가들은 특별한 종류의 음료를 선호합니다.을 하위 이 다로 수 .drink()
방법. 여전히 에 여전히 하지만 그것은 여전히 계급 수준이고, 이것 때문에 그것은 여전히 일반적인 것입니다.
hans = German(favorite_drink = "Cola")
클래스 독일어를 인스턴스화하고 저는 처음에 기본 특성을 "바꿨다"고 했습니다. (하지만 hans.drink('Milk')라고 부르면 그는 여전히 "맥주가 더 필요해요"라고 인쇄할 것입니다. - 명백한 버그입니다.아니면 제가 더 큰 회사의 직원이 된다면 그것을 기능이라고 부를지도 모릅니다. ;-!)
예를 들어 유형의 특성.)는 어한)됩니다)를 됩니다(python:__init__
을(를) 을(를) 인스턴스화하는 순간에.클래스를 개체로 정의하는 시점입니다.삶을 추상적인 개념(계급)에 불어넣는 것은 개인의 특성으로 채우고 대상이 됨으로써라고 말할 수 있을 것입니다.
그러나 모든 개체는 클래스의 인스턴스이기 때문에 기본적인 특성 유형과 일부 동작을 공유합니다.이는 객체 지향적 개념의 주요 장점입니다.
캡슐화하는 각 개체의 특성을 보호하려면 행동과 특성을 결합하고 개체 외부에서 조작하기 어렵게 만들어야 합니다.그것이 인캡슐레이션(1)
인스턴스의 변수를 초기화하기 위한 것입니다.
예를 들어 a를 만들다crawler
특정 데이터베이스 이름을 가진 instance(위의 예에서).
당신의 차를 예로 들어보자면, 당신은 차를 얻을 때 무작위로 차를 얻는 것이 아닙니다. 제 말은, 당신이 색상, 브랜드, 좌석 수 등을 선택하는 것입니다.또한 휠 수나 등록 번호와 같이 선택하지 않고 "초기화"하는 것도 있습니다.
class Car:
def __init__(self, color, brand, number_of_seats):
self.color = color
self.brand = brand
self.number_of_seats = number_of_seats
self.number_of_wheels = 4
self.registration_number = GenerateRegistrationNumber()
에.__init__
생성하려는 인스턴스의 속성을 정의하는 메서드입니다.서,면,는 2입니다를 입니다.Car
예:
my_car = Car('blue', 'Renault', 2)
의 .Car
이.__init__
속성:입니다)을 예:color
아니면brand
입니다와 같은합니다.registration_number
.
- Python의 클래스에 대해 자세히 알아보기
- 방법에 대한 자세한 정보
요를 해야 할 것 .__init__
인스턴스의 가변 속성을 올바르게 초기화하려면 Python에서 실행해야 합니다.
다음 예를 참조하십시오.
>>> class EvilTest(object):
... attr = []
...
>>> evil_test1 = EvilTest()
>>> evil_test2 = EvilTest()
>>> evil_test1.attr.append('strange')
>>>
>>> print "This is evil:", evil_test1.attr, evil_test2.attr
This is evil: ['strange'] ['strange']
>>>
>>>
>>> class GoodTest(object):
... def __init__(self):
... self.attr = []
...
>>> good_test1 = GoodTest()
>>> good_test2 = GoodTest()
>>> good_test1.attr.append('strange')
>>>
>>> print "This is good:", good_test1.attr, good_test2.attr
This is good: ['strange'] []
이는 Java의 경우 각 속성이 새 값으로 자동 초기화되는 경우와 상당히 다릅니다.
import java.util.ArrayList;
import java.lang.String;
class SimpleTest
{
public ArrayList<String> attr = new ArrayList<String>();
}
class Main
{
public static void main(String [] args)
{
SimpleTest t1 = new SimpleTest();
SimpleTest t2 = new SimpleTest();
t1.attr.add("strange");
System.out.println(t1.attr + " " + t2.attr);
}
}
직관적으로 예상할 수 있는 결과는 다음과 같습니다.
[strange] []
하지만 당신이 선언한다면,attr
~하듯이static
Python 처럼합니다.
[strange] [strange]
__init__
함수는 클래스의 모든 멤버 변수를 설정하는 것입니다.따라서 바이클러스터가 생성되면 멤버에 액세스하여 값을 돌려받을 수 있습니다.
mycluster = bicluster(...actual values go here...)
mycluster.left # returns the value passed in as 'left'
Python Documents에서 몇 가지 정보를 확인해보세요.OOO의 개념에 대한 책을 집어 들고 학습을 계속할 것입니다.
클래스는 해당 개체에 대해 특정한 속성(상태, 특성)과 메서드(함수, 용량)를 가진 개체입니다(각각 흰색 및 오리의 경우 플라이 파워).
클래스의 인스턴스를 만들 때, 클래스에 초기 성격(신생아의 드레스 이름, 색상과 같은 상태 또는 문자)을 지정할 수 있습니다.당신은 이것을 합니다.__init__
.
으로.__init__
합니다를 할 때 합니다.instance = MyClass(some_individual_traits)
.
class Dog(object):
# Class Object Attribute
species = 'mammal'
def __init__(self,breed,name):
self.breed = breed
self.name = name
위의 예제에서 우리는 종을 전역으로 사용합니다. 왜냐하면 그것은 항상 같기 때문입니다. (당신이 말할 수 있는 일종의 상수)전화할때__init__
내부 methodd__init__
시작됩니다(예: breed, 이름).
class Dog(object):
a = '12'
def __init__(self,breed,name,a):
self.breed = breed
self.name = name
self.a= a
아래에 전화를 걸어 위 예시를 인쇄하면 다음과 같습니다.
Dog.a
12
Dog('Lab','Sam','10')
Dog.a
10
즉, 개체를 생성하는 동안에만 초기화됩니다.그래서 당신이 상수라고 선언하고 싶은 어떤 것이든 그것을 전역적으로 만들고 변화시키는 어떤 것이든 사용합니다.__init__
__init__()
캔:
- 클래스 인스턴스를 초기화합니다.
- 부름을 많이 받다
- 만 가능한
None
.
를 들면, ,Person
클래스가 가지고 있습니다.__init__()
아래와 같이
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
print('"__init__()" is called.')
이제 우리는 다음과 같은 인스턴스를 생성하고 초기화합니다.Person
아래와 같은 클래스:
# Here
obj = Person("John", 27)
그리고나서,__init__()
와 같이다이라고
"__init__()" is called.
가 합니다.name
그리고.age
다음과 같이 초기화됩니다.
obj = Person("John", 27)
print(obj.name) # Here
print(obj.age) # Here
그리고나서,name
그리고.age
다음과 같이 초기화됩니다.
"__init__()" is called.
John # Here
27 # Here
그리고.__init__()
다음과 같이 여러 번 호출할 수 있습니다.
obj = Person("John", 27)
print(obj.__init__("Tom", "18")) # Here
print(obj.name)
print(obj.age)
그리고나서,__init__()
스의 를 만듭니다.Person
하고 ㅇNone
됩니다에서 됩니다.__init__()
아래와 같이
"__init__()" is called.
"__init__()" is called.
None
Tom
18
마지막으로 만약에__init__()
않습니다None
우리는 전화를 합니다.__init__()
아래와 같이
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
print('"__init__()" is called.')
return "Hello" # Here
obj = Person("John", 27) # Here
다음 오류가 발생합니다.
TypeError: init()는 'str'이 아닌 None을 반환해야 합니다.
언급URL : https://stackoverflow.com/questions/8609153/why-do-we-use-init-in-python-classes
'programing' 카테고리의 다른 글
XPath, XQuery 및 XPointer의 차이 (0) | 2023.09.24 |
---|---|
동일한 신호에 대해 여러 개의 신호 처리기를 갖는 것이 유효합니까? (0) | 2023.09.24 |
fs.readFileSync는 파일 상대적이지 않습니까?Node.js (0) | 2023.09.24 |
매개 변수에 공백이 있을 때 파워셸에서 msdeploy를 어떻게 부르나요? (0) | 2023.09.24 |
"addClass" 전에 "hasClass"를 사용해야 합니까? (0) | 2023.09.24 |