고급 객체 지향 구문 부분
@staticmethod 데코레이터를 통해 데코레이팅된 메서드를 정적 메서드로 바꿀 수 있습니다. 실제로 일반 메소드는 인스턴스화 직후에 호출할 수 있고, 인스턴스 변수나 클래스 변수는 메소드 내에서 self를 통해 호출할 수 있지만, 정적 메소드는 인스턴스 변수나 클래스 변수에 접근할 수 없고, 접근할 수도 없다는 점을 이해하기 어렵지 않습니다. 변수 및 클래스 변수의 메서드는 실제로 클래스 자체와 관련이 없습니다. 클래스와의 유일한 연결은 클래스 이름을 통해 메서드를 호출해야 한다는 것입니다.
class SchoolMember(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex member_nums = 0def introduce(self): print("My name is %s,and I am %s year old." %(self.name,self.age)) @staticmethod def talk(): print("I like to study python")class Teacher(SchoolMember): def __init__(self,name,age,sex,course,salary): super(Teacher,self).__init__(name,age,sex) self.course = course self.salary = salary def Teaching(self): print("Teacher %s is teaching %s." %(self.name,self.course)) s1 = Teacher("alex",22,"Femal","python",10000) print("before:",s1.member_nums) SchoolMember.member_nums = 12print("before:",s1.member_nums) s1.member_nums = 666 #是在类中重新生成一个变量 print("after:",s1.member_nums) SchoolMember.member_nums = 12print("after:",s1.member_nums)
위 코드에서 member_nums는 클래스 변수입니다. s1.member_nums가 직접 호출되면 클래스의 값이 호출되고, s1.member_nums = 666이면 새 변수를 추가하는 것과 같습니다. 인스턴스입니다. 이때 클래스 값을 수정해도 인스턴스의 변수 값에는 영향을 미치지 않습니다. 위 코드의 출력은 다음과 같습니다.
before: 0
before: 12
after: 666
after: 666
@staticmethon 클래스의 정적 메서드:
SchoolMember(==== % % %= SchoolMember(,,
위에서 코드가 없으면 @staticmethon을 사용하면 코드 실행에 확실히 문제가 없지만 @staticmethod를 사용하면 시스템에서 누락된 매개 변수가 하나 있다는 메시지를 표시합니다. 메소드를 정적 메소드로 바꾸면 이 메소드는 인스턴스와 거의 관련이 없습니다.
class SchoolMember(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex member_nums = 0def introduce(self): print("My name is %s,and I am %s year old." %(self.name,self.age)) @classmethod #类方法,不能访问实例变量 def talk(self): print("%s like to study python" %SchoolMember.member_nums) @staticmethod #让方法在类中剥离,与类没有关系,调用要传递参数 def walk(self): print("%s is walking......" %self) #SchoolMember.talk() #不能调用,类是没有办法访问实例变量,只能访问自己 s1 = SchoolMember("Alex",22,"Female") #实例化 s1.walk("alex")
@staticmethod 정적 메서드는 클래스 내의 메서드를 클래스와 관련이 없도록 만드는 것이며, 호출 시 매개 변수를 전달해야만 호출할 수 있습니다.
클래스 메소드
클래스 메소드는 @classmethod 데코레이터를 통해 구현됩니다. 클래스 메소드와 일반 메소드의 차이점은 클래스 메소드는 인스턴스 변수가 아닌 클래스 변수에만 접근할 수 있다는 점입니다.
class SchoolMember(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex member_nums = 0def introduce(self): print("My name is %s,and I am %s year old." %(self.name,self.age)) #@classmethod #类方法,不能访问实例变量 def talk(self): print("%s like to study python" %self.name) SchoolMember.member_nums #SchoolMember.talk() #不能调用,类是没有办法访问实例变量,只能访问自己 s1 = SchoolMember("Alex",22,"Female") #实例化 s1.talk()
위 코드에서 (1) 클래스는 인스턴스의 속성에 직접 액세스할 수 없습니다 (2) @classmethod의 기능은 프로그램이 SchoolMember와 같은 클래스의 변수에만 액세스할 수 있도록 허용하는 것입니다. 위의 코드 .member_nums는 클래스 메소드입니다. 대화로 액세스할 수 있지만 @classmethod는 클래스 속성에만 액세스할 수 있기 때문에 self.name에는 액세스할 수 없습니다.
class SchoolMember(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex member_nums = 0def introduce(self): print("My name is %s,and I am %s year old." %(self.name,self.age)) @classmethod #类方法,不能访问实例变量 def talk(self): print("%s like to study python" %self.name) SchoolMember.member_nums #SchoolMember.talk() #不能调用,类是没有办法访问实例变量,只能访问自己 s1 = SchoolMember("Alex",22,"Female") #实例化 s1.talk() 运行结果如下: Traceback (most recent call last): File "/home/zhuzhu/day7/staticmethon方法.py", line 18, in <module>s1.talk() File "/home/zhuzhu/day7/staticmethon方法.py", line 13, in talk print("%s like to study python" %self.name) AttributeError: type object 'SchoolMember' has no attribute 'name'
위에서 볼 수 있듯이, 위의 @classmethon 코드는 클래스 내 인스턴스 변수를 금지하고, 클래스 변수만 사용할 수 있습니다. 즉, self.name, self.age, self.sex는 사용할 수 없으며, self.nember_nums, SchoolMember.member_nums 클래스의 변수만 사용할 수 있습니다.
class SchoolMember(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex member_nums = 0def introduce(self): print("My name is %s,and I am %s year old." %(self.name,self.age)) @classmethod #类方法,不能访问实例变量 def talk(self): print("%s like to study python" %SchoolMember.member_nums) SchoolMember.member_nums #SchoolMember.talk() #不能调用,类是没有办法访问实例变量,只能访问自己 s1 = SchoolMember("Alex",22,"Female") #实例化 s1.talk() 运行结果如下:0 like to study python
속성 메서드
속성 메서드의 기능은 @property를 통해 메서드를 정적 속성으로 바꾸는 것입니다.
SchoolMember(==== % % %= SchoolMember(,,
@property를 추가하지 않은 경우 즉, 프로그램은 정상적으로 실행이 되지만, @property를 추가한 후 프로그램 실행 시 오류가 발생하는 이유는 무엇인가요? @property는 클래스 메소드를 클래스 속성으로 바꾸기 때문에 호출 시 다음과 같이 괄호를 추가하지 않고 s1.walk()만 실행하면 됩니다.
SchoolMember(==== % % %= SchoolMember(,,
위 코드에서 @property는 클래스를 회전시킵니다. 메소드를 멤버 속성에 추가하고 s1.walk를 사용하여 직접 호출할 수 있습니다.
클래식 vs 뉴 스타일
class A: #经典类的写法,新式类是A(object)尽量少用经典类,都用新式类现在 def __init__(self,name): self.name = name def f1(self): print("f1,搞基")class B(A): def __init__(self,name): super(B,self).__init__(name) # def f1(self): # print("f1,来呀")class C(A): def __init__(self,name): super(C,self).__init__(name) #def f1(self): #print("f1,一起搞!")class D(B,C): pass d = D("Alex") d.f1()
위 코드에서 클래스 D는 클래스 B와 클래스 C를 상속받습니다. 클래스 D에서 메소드를 실행하면 먼저 클래스 B에서 검색합니다. 이 클래식 클래스와 새 클래스는 No를 검색하면 동일합니다. 클래식 클래스는 클래스 A에서 검색되고, 새 클래스는 클래스 C에서 검색됩니다. 예는 다음과 같습니다. (참고: 차이점은 버전 2.X에서 실행해야 하며, 3.X는 최적화되어 있으며, 클래스 B에서는 못찾으시면 C클래스에서 검색하세요)
다음은 Classic 클래스와 New-style 클래스의 실행 순서입니다.
(new-style 수업) 같은 레벨의 클래스부터 먼저 실행됩니다.
(2) 클래식 클래스 (이전 클래스 먼저 실행)
위 내용은 객체지향 고급의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!