주어진 프로그래밍 언어에서 객체 나 다른 것들이 언제 "일등"이라고 말합니까? 다른 언어와 다른 점은 무엇입니까?
편집하다. 파이썬에서와 같이 "모든 것이 객체"라고 말할 때 실제로 "모든 것이 일류"라는 의미입니까?
주어진 프로그래밍 언어에서 객체 나 다른 것들이 언제 "일등"이라고 말합니까? 다른 언어와 다른 점은 무엇입니까?
편집하다. 파이썬에서와 같이 "모든 것이 객체"라고 말할 때 실제로 "모든 것이 일류"라는 의미입니까?
답변:
즉, 객체 사용에 제한이 없음을 의미합니다. 다른 객체와 동일합니다.
첫 번째 클래스 객체는 동적으로 생성, 소멸, 함수에 전달, 값으로 반환되고 프로그래밍 언어의 다른 변수와 같은 모든 권한을 가질 수있는 엔터티입니다.
언어에 따라 다음을 의미 할 수 있습니다.
- 익명의 리터럴 값으로 표현 가능
- 변수에 저장 가능
- 데이터 구조에 저장 가능
- 고유 한 정체성을 가진 사람 (명칭과 무관)
- 다른 단체와의 평등에 필적하는 것
- 프로 시저 / 함수에 매개 변수로 전달 가능
- 절차 / 기능의 결과로 반환 가능
- 런타임에 구성 가능
- 인쇄 가능
- 읽을 수있는
- 분산 프로세스간에 전송 가능
- 실행중인 프로세스 외부에 저장 가능
소스 .
그러나 C ++ 함수 자체는 일류 객체가 아닙니다.
C ++에서 클래스는 첫 번째 클래스 객체가 아니라 해당 클래스의 인스턴스입니다. 파이썬에서 클래스 와 객체는 모두 일류 객체입니다. (참조 이 대답 객체로 클래스에 대한 자세한 내용을).
다음은 Javascript 일급 함수의 예입니다.
// f: function that takes a number and returns a number
// deltaX: small positive number
// returns a function that is an approximate derivative of f
function makeDerivative( f, deltaX )
{
var deriv = function(x)
{
return ( f(x + deltaX) - f(x) )/ deltaX;
}
return deriv;
}
var cos = makeDerivative( Math.sin, 0.000001);
// cos(0) ~> 1
// cos(pi/2) ~> 0
소스 .
1 급 객체가 아닌 엔티티를 2 급 객체라고합니다. C ++의 함수는 동적으로 만들 수 없기 때문에 두 번째 클래스입니다.
편집 관련 :
편집하다. 파이썬에서와 같이 "모든 것이 객체"라고 말할 때 실제로 "모든 것이 일류"라는 의미입니까?
객체라는 용어는 느슨하게 사용할 수 있으며 일등석을 의미하지는 않습니다. 그리고 전체 개념을 '일등 실체'라고 부르는 것이 더 합리적 일 것입니다. 그러나 파이썬에서는 모든 것을 일등으로 만드는 것을 목표로합니다. 나는 당신의 진술을 한 사람의 의도가 일등을 의미한다고 생각합니다.
"파이썬에서와 같이"모든 것이 객체 "라고 말할 때 실제로"모든 것이 일류 "라는 의미입니까?"
예.
파이썬의 모든 것은 적절한 객체입니다. 다른 언어로 "기본형"인 것조차도.
2
실제로 같은 객체 에는 상당히 풍부하고 정교한 인터페이스가 있습니다.
>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']
모든 것이 파이썬에서 일류 객체이기 때문에 모호한 특수 사례는 거의 없습니다.
예를 들어 Java에는 올바른 객체가 아닌 기본 유형 (int, bool, double, char)이 있습니다. 그렇기 때문에 Java는 정수, 부울, 이중 및 문자를 일급 유형으로 도입해야합니다. 이것은 초보자에게 가르치기가 어려울 수 있습니다. 왜 기본 유형과 클래스가 나란히 존재해야하는지는 분명하지 않습니다.
또한 객체의 클래스 자체가 객체라는 것을 의미합니다. 이것은 클래스가 런타임에 항상 존재하지 않는 C ++과 다릅니다.
의 유형 은 메소드, 속성 및 유형 2
이있는 type 'int'
오브젝트입니다.
>>> type(2)
<class 'int'>
내장 유형의 유형 int
은 type 'type'
객체입니다. 여기에는 메소드와 속성도 있습니다.
>>> type(type(2))
<class 'type'>
int
. 따라서 "오래된"클래스와 "새로운 스타일의 클래스"(3에는 더 이상 올드 스타일 클래스가 없음)가 있습니다.
“일등석”은 평소와 같이 업무를 수행 할 수 있음을 의미합니다. 대부분의 경우 이는 단지 일류 시민을 함수에 대한 인수로 전달하거나 함수에서 반환 할 수 있음을 의미합니다.
이것은 객체에 대해 자명하지만 기능이나 클래스에 대해 항상 분명하지는 않습니다.
void f(int n) { return n * 2; }
void g(Action<int> a, int n) { return a(n); }
// Now call g and pass f:
g(f, 10); // = 20
함수가 실제로 일류 객체 가 아닌 C #의 예입니다 . 따라서 위의 코드는 작은 해결 방법 (즉,이라는 일반 대리자 Action<>
)을 사용하여 함수를 인수로 전달합니다. Ruby와 같은 다른 언어를 사용하면 클래스와 코드 블록도 일반 변수 (또는 Ruby의 경우 상수)로 처리 할 수 있습니다.
컴퓨터 프로그램의 구조와 해석의 슬라이드에서 강의 2A (1986)는 Christopher Stracey를 인용합니다 .
일류 시민의 권리와 특권 :
IMO 이것은 자연 언어로 사물을 묘사하는 데 사용되는 은유 중 하나입니다. 이 용어는 본질적으로 함수를 일급 객체로 설명하는 맥락에서 사용됩니다.
객체 지향 언어를 고려하면 상속, 클래스 정의, 코드의 다른 섹션에 전달하는 기능 (메서드 인수), 데이터 구조에 저장하는 기능 등과 같은 다양한 기능을 객체에 부여 할 수 있습니다. 자바 스크립트의 경우 함수와 같이 일반적으로 객체로 간주되지 않는 엔터티와 동일하게 이러한 엔터티는 일류 객체로 간주됩니다.
여기서 1 급은 본질적으로 2 급으로 취급되지 않는 것을 의미합니다 (저하 된 행동으로). 본질적으로 조롱은 완벽하거나 구별 할 수 없습니다.