2017-03-23 1 views
1

다음 예에서 미래의 상황의 문맥에 따라 상수를 선택할 수 있습니다.클래스를 사용하는 예제를 올바르게 구현하려면 어떻게해야합니까?

class Constants: 
    SPEEDLIGHT = 3 * 10**8 
    GRAVITY = 9.81 

C = Constants() 
print(C.GRAVITY) 
>> 9.81 

각 수량이 고정 상수이기 때문에 그리 어렵지 않았습니다. 그러나 기능을 위해 비슷한 것을하고 싶다고 가정 해 봅시다. 아래의 첫 번째 코드 블록에서는 integerble 변수 x과 고정 매개 변수 ab의 두 가지 분포를 지정합니다.

class IntegrableDistribution: 
    def Gaussian(x,a,b): 
     cnorm = 1/(b * (2 * pi)**(1/2)) 
     return cnorm * np.exp((-1) * (x-a)**2/(2 * b**2)) 
    # Gaussian = Gaussian(x,a,b) 

    def Lognormal(x,a,b): 
     cnorm = 1/(b * (2 * pi)**(1/2)) 
     return cnorm * exp((-1) * (np.log(x)-a)**2/(2 * b**2))/x 
    # Lognormal = Lognormal(x,a,b) 

내가 호출 할 수 있도록 배포판의 이름을 지정하려고했습니다. 결과적으로 위의 코드는 오류 메시지가됩니다. 이 다음 코드 블록에서는 입력을 사용하여 통합을위한 배포를 선택하려고합니다 (매우 비효율적이라고 생각하지만).

Integrable = IntegrableDistribution() 

class CallIntegrableDistribution: 

    def Model(): 

     def Pick(): 
      """ 
      1 : Gaussian Distribution 
      2 : Lognormal Distribution 
      """ 
      self.cmnd = cmnd 
      cmnd = int(input("Pick a Distribution Model: ")) 
      return cmnd 

     self.cmnd = cmnd 

     if cmnd == 1: 
      Distribution = Integrable.Gaussian 
     if cmnd == 2: 
      Distribution = Integrable.Lognormal 

     return Distribution 

OR ALTERNATIVELY 

    cmnd = { 
     1: Gaussian, 
     2: Lognormal, 
    } 

저는 배포판의 문제점에 대해서는별로 관심이 없습니다. 나는 단지 내 알려진 것들과 알려지지 않은 것들을 보여주기 위해 그것을 적용 할 뿐이다. 클래스 또는 사전을 사용하여 올바르게 수행 할 수있는 방법은 무엇입니까?

+1

1. 오류가 무엇입니까? 2. 함수에 대문자를 사용하지 마십시오. 그것은 수업을 위해 예약되어 있습니다. – Carcigenicate

+0

'TypeError : * : 'property'와 'float'에 대해 지원되지 않는 피연산자 유형 – mikey

답변

2

사용 static methods :

class IntegrableDistribution: 
    @staticmethod 
    def Gaussian(x,a,b): 
     cnorm = 1/(b * (2 * pi)**(1/2)) 
     return cnorm * np.exp((-1) * (x-a)**2/(2 * b**2)) 

    @staticmethod 
    def Lognormal(x,a,b): 
     cnorm = 1/(b * (2 * pi)**(1/2)) 
     return cnorm * exp((-1) * (np.log(x)-a)**2/(2 * b**2))/x 

그리고 사용 :

some_result = IntegrableDistribution.Gaussian(1, 2, 3) 
another_result = IntegrableDistribution.Lognormal(1, 2, 3) 
+0

그게 더 의미가 있으며 주위에서 놀 수있는 뭔가를 제공합니다. 연결된 문서에서 "정적 메서드는 암시 적 첫 번째 인수를받지 못합니다." 이것은 x를 고정 된 매개 변수 대신 함수 변수로 전달할 수 없다는 것을 의미합니까? – mikey

+1

@mikey. 이것은 인스턴스 메소드와는 달리 정적 메소드를 호출 할 때 첫 번째 인자는 메소드가 호출 된 인스턴스가 아니라는 것을 의미합니다. *는 * 인스턴스가 없으므로 의미가 있습니다. 이 답변보기 : http://stackoverflow.com/a/1669524/1453822 – DeepSpace

관련 문제