>  기사  >  백엔드 개발  >  객체지향 고급

객체지향 고급

巴扎黑
巴扎黑원래의
2017-06-23 14:46:191140검색

고급 객체 지향 구문 부분

@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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.