2017-12-01 3 views
3

저는 Python에서 OOP를 배우고 있습니다.여러 객체의 속성 변경

dog = Animal("dog") 
cat = Animal("cat") 
giraffe = Animal("giraffe") 

내가 하나 그들의 모든 하나 하나에 굶주림의 값을 변경) (먹는 방법을 사용하고 싶습니다 :

class Animal: 

    def __init__(self, name="", hunger=0): 
     self.name = name 
     self.hunger = hunger 

    def eat(self): 
     self.hunger += 1 

그리고 일부 개체 :

나는 예를 들어 클래스가 타격. 이미 이런 식으로 뭔가를 시도 :

Animal.eat() 

그러나이 작동하지 않습니다 (형식 오류 때문에 인수 '자기'실종의,있다). 또한

:

Animal.hunger += 1 

가 작동하지 않습니다는 (AttributeError를 반환).

누구나 아이디어가 있다면 매우 감사하게 생각합니다.

+0

항상 같은 굶주림을 갖기를 원하십니까? 또는 다른 굶주림이 먹을 때 같은 번호로 바뀌 었습니까? – schwobaseggl

+2

'list' 나'dict'와 같은 컨테이너에 인스턴스를 저장하고,'eat' 메소드를 개별적으로 호출하는 과정을 반복해야합니다. –

답변

1

@schwobaseggi는 당신이하고 싶은 일에 대해 가장 직접적인 대답을 가지고 있지만, 당신이하고 싶은 것은 문제를 요구하는 것 같습니다. 아주 다른 두 가지 일을하는 한 가지 수업이 있습니다. Animal은 이름이 있고 먹는 동물, 이며 모든 동물 인스턴스를 추적하여 모두을 먹습니다. Animal은 개별 동물이하는 일을하고 동물 그룹을 통제하려고합니다.

개체의 두 가지 종류로이 분할하는 것이 좋습니다 수 있습니다 : 동물 및 Zoo 또는 Farm 또는 Herd 같은 AnimalGroup의 일종. AnimalGroup 클래스는 일련의 인스턴스를 추적하여 모두 수행하도록해야합니다.

class AnimalGroup(object): 
    def __init__(self, animal_list): 
     self.animals = animal_list[:] 

    def add_animal(self, animal): 
     self.animals.append(animal) 

    def all_eat(self): 
     for animal in self.animals: 
      animal.eat() 

dog = Animal("dog") 
cat = Animal("cat") 
giraffe = Animal("giraffe") 
group = AnimalGroup([dog, cat, giraffe]) 
group.all_eat() 
group.add_animal(Animal("pig")) 
group.all_eat() 

이 각 클래스의 책임을 분리하고 나중에 변경하는 일이 훨씬 쉬워집니다. 이제는 동물 수업을 변경하지 않고도 다양한 그룹 행동을 할 수 있습니다. Animal을 상속받은 새로운 동물 수업을 가질 수 있으며 부작용에 대해 걱정할 필요가 없습니다. 예 : class Mammal(Animal). Mammal.eat으로 전화하면 모든 동물이 업데이트됩니까? 그것은 수도. 클래스 변수는 그렇게 까다로울 수 있습니다. 모든 동물을 업데이트해야합니까? 몰라. AnimalGroup 개체를 사용하면 걱정할 필요가 없습니다.

+0

대단히 고맙습니다. 그게 제가 찾고 있던 바로 그 것입니다! – jb0hn

0

당신은 클래스 변수로 선언해야하는 클래스에 뭔가를하고자하는 경우 :

class Animal: 
    hunger = 0 

    def __init__(self, name=""): 
    self.name = name 

    @classmethod 
    def eat(klass): 
    klass.hunger += 1 

당신이 당신의 클래스를 수정 클래스 방법을 참조 할 것 Animal.eat() 전화 언제든지이 방법 변하기 쉬운. 여전히 self.hunger을 사용하여 Animal 클래스 내에서 변수에 액세스 할 수는 있지만 혼란 스러울 때 돌아오고 클래스 변수와 멤버 변수가 무엇인지 결정하려고 시도 할 때이를 권고합니다.

+0

dog.eung() 후에 dog.hunger = 0을 수행하면 실패합니다. 계속 개를 먹고 먹으면 값이 변하지 않을 것입니다. –

+0

@AmitTripathi 정적 변수와 멤버 변수가 "실패"하지 않습니다. 'dog.hunger = 0'을하면 방금 클래스의 정적 변수를 덮어 쓰는'dog' 객체에 멤버 변수를 만들었습니다. – MCBama

+0

알아요.하지만 방금 라인이 매우 얇은 것을 지적했습니다. 나는 왜 OP가 그런 요구 사항을 요구하는지 모르지만, 이런 종류의 코드는 내가 사용하지 않을 것이다. –

4

당신은 인스턴스를 수집하는 클래스 변수를 유지하고 eat 자신의 배고픈 모두를 조정할 수 있습니다

class Animal: 
    instances = [] 

    def __init__(self, name="", hunger=0): 
     self.name = name 
     self.hunger = hunger 
     Animal.instances.append(self) 

    def eat(self): 
     for i in Animal.instances: 
      i.hunger += 1 

를 의미 적, 당신은 그것을 classmethod을 할 수 있습니다,

@classmethod 
    def eat(cls): 
     for i in cls.instances: 
      i.hunger += 1 

당신을 생각 네가 원한다면 여전히 인스턴스에서 호출 할 수있다. 본인이 아는

-1

(그리고 정말 파이썬에서 OOP와 같은),이 작업을 수행 할 수있는 유일한 방법은 일명 특정 속성 당신이해야 할 것입니다 무엇을 그리고

class Animals: 
    def __init__(self, animals): 
     self.animals = animals 
    def all_eat(self): 
     for animal in animals: 
      animal.eat() 

으로 새로운 클래스를 만드는 것입니다 do :

이유는 파이썬 클래스 자체에는 호출 가능한 속성이 없으므로 클래스의 각 인스턴스를 개별적으로 호출해야하기 때문입니다.

+0

Python 클래스에는 호출 할 수있는 특성이 없습니다. 내 속성을 항상 호출한다는 사실을 생각하는 것을 정의하십시오. – MCBama

+0

모호한 언어로 불편을 드려 죄송합니다. 파이썬 클래스 (파이썬 클래스의 인스턴스가 아닌 클래스 자체)는 속성을 저장하거나 값을 찾을 수 없다는 것을 확신합니다.내가 틀렸다면 나를 바로 잡으십시오. – 13ros27

+0

할 수 있습니다. 아래 답변 중 일부를 확인하면 인스턴스가 아닌 클래스와 연관된 "정적 변수"의 여러 인스턴스가 표시됩니다. – MCBama

1

는 실제로이 같은 객체 자체에 전화를해야 :

cat.eat() 
dog.eat() 
giraffe.eat() 

달리 실제로 변경하는 개체를 알 수 없습니다.당신은 다른 후에 하나의 모두에 함수를 호출하는 해당 배열을 통해 배열과 루프에서 모든 객체를 저장할 수 : 당신이 원하는 경우

dog = Animal("dog") 
cat = Animal("cat") 
giraffe = Animal("giraffe") 
animals=[dog, cat, giraffe] 
for animalType in animals: 
    animalType.eat() 

지금은 한 번에 한 번 또는 한 곳에서 모두 할 수 있습니다. 당신이 그들을 만든 후 그러나 최신 목록을 유지하기 위해 배열에 동물을 addnew해야합니다 eat()가 단일 인스턴스에서 호출

fish=new Animal("fish") 
animals.append(fish) 
1
class Animal(object): 

    hunger = 0 

    def __init__(self, name=""): 
     self.name = name 


    def eat(self): 
     Animal.hunger = Animal.hunger + 1 

dog = Animal("dog") 
cat = Animal("cat") 
giraffe = Animal("giraffe") 


dog.eat() 

print("Dog's hunger variable is", dog.hunger) 
1 
dog.eat() 

print("Dog's hunger variable is :",dog.hunger) 
2 

print("Cat's hunger variable is :",cat.hunger) 
2 

print("Giraffe's hunger variable is :", giraffe.hunger) 
2 

hunger 변수는 모든 인스턴스에 업데이트됩니다!