Python 面向对象基础补充 - 图1
    类是模板,实例是根据类创建的对象

    定义一个Square类

    1. class Square: # 定义一个正方形类
    2. angle = 90 # 类属性,正文形内角
    3. def __init__(self,length):
    4. self.length_value = length # 实例属性, 边长
    5. def get_perimeter(self): # 实例方法,周长
    6. p = self.length_value * 4
    7. return p
    8. def get_acreage(self): # 实例方法, 面积
    9. s = self.length_value ** 2
    10. return s
    • angle 属于类属性,即所有正方形共有的特性;
    • self.length_value 为实例属性,类实例化后归该实例所有,不同的实例这个 self.length_value 的值也不同(因为实例化Square类时,传入的length参数的值是不同的);
    • def get_perimeter(self)、def get_acreage(self) 两个方法都为实例方法,类实例化后可调用;

    在类外部实现类属性的访问(即在类外部获取到 angle 的值)

    1. class Square: # 定义一个正方形类
    2. angle = 90 # 类属性,正文形内角
    3. def __init__(self,length):
    4. self.length_value = length # 实例属性, 边长
    5. def get_perimeter(self): # 实例方法,周长
    6. p = self.length_value * 4
    7. return p
    8. def get_acreage(self): # 实例方法, 面积
    9. s = self.length_value ** 2
    10. return s
    11. # 方法一
    12. angle_value_01 = Square.angle # 在类的外部访问 angle 这个类属性,通过 类名.属性名 实现
    13. print(angle_value_01)
    14. # 方法二
    15. small_square = Square(3) # 在类外部首先实例化一个length=3的实例 small_square
    16. angle_value_02 = small_square.angle # 通过 实例.属性名 实现访问
    17. print(angle_value_02)

    在类内部实例方法中实现类属性的访问(即在类内部实例方法中获取到 angle 的值)

    1. class Square: # 定义一个正方形类
    2. angle = 90 # 类属性,正文形内角
    3. def __init__(self,length):
    4. self.length_value = length # 实例属性, 边长
    5. def get_perimeter(self): # 实例方法,周长
    6. p = self.length_value * 4
    7. return p
    8. def get_acreage(self): # 实例方法, 面积
    9. s = self.length_value ** 2
    10. return s
    11. '''在类内部获取 类属性angle 的两种方法'''
    12. def get_twoAngle_sum01(self): # 实例方法,两个内角的和
    13. sum = self.angle * 2 # 在实例方法中访问类属性angle,可通过self.angle访问获取到值
    14. return sum
    15. def get_twoAngle_sum02(self): # 实例方法,两个内角的和
    16. sum = Square.angle * 2 # 在实例方法中访问类属性angle,还可通过 类名.angle访问获取到值
    17. return sum

    在类外部实现实例属性的访问(即在类外部获取到 self.length_value 的值)

    1. class Square: # 定义一个正方形类
    2. angle = 90 # 类属性,正文形内角
    3. def __init__(self,length):
    4. self.length_value = length # 实例属性, 边长
    5. def get_perimeter(self): # 实例方法,周长
    6. p = self.length_value * 4
    7. return p
    8. def get_acreage(self): # 实例方法, 面积
    9. s = self.length_value ** 2
    10. return s
    11. # 访问实例属性,必须实例化类后才能访问,不能通过类名直接访问
    12. small_square = Square(3) # 在类外部首先实例化一个length=3的实例 small_square
    13. length_value01 = small_square.length_value # 通过 实例.属性名 实现访问
    14. length_value02 = Square(3).length_value # 该方法与上面 small_square.length_value 等价
    15. print(length_value01)
    16. print(length_value02)

    在类外部实现实例方法的调用(即在类外部调用 get_perimeter( ))

    1. class Square: # 定义一个正方形类
    2. angle = 90 # 类属性,正文形内角
    3. def __init__(self,length):
    4. self.length_value = length # 实例属性, 边长
    5. def get_perimeter(self): # 实例方法,周长
    6. p = self.length_value * 4
    7. return p
    8. def get_acreage(self): # 实例方法, 面积
    9. s = self.length_value ** 2
    10. return s
    11. # 调用实例方法,必须实例化类后才能调用,不能通过类名直接调用
    12. small_square = Square(3) # 在类外部首先实例化一个length=3的实例 small_square
    13. perimeter01 = small_square.get_perimeter() # 通过 实例.方法名 实现调用
    14. perimeter02 = Square(3).get_perimeter() # 该方法与上面 small_square.get_perimeter() 等价
    15. print(perimeter01)
    16. print(perimeter02)

    在类内部实例方法中对实例方法的调用(即在类内部的实例方法中调用 get_perimeter( ))

    1. class Square: # 定义一个正方形类
    2. angle = 90 # 类属性,正文形内角
    3. def __init__(self,length):
    4. self.length_value = length # 实例属性, 边长
    5. def get_perimeter(self): # 实例方法,周长
    6. p = self.length_value * 4
    7. return p
    8. def get_acreage(self): # 实例方法, 面积
    9. s = self.length_value ** 2
    10. return s
    11. '''该方法实现获取两倍周长,通过调用实例方法self.get_perimeter()来计算处理'''
    12. def get_double_perimeter(self): # 实例方法,获取2倍的周长
    13. double_p = self.get_perimeter()*2
    14. return double_p

    类方法:在类内部,由@classmethod装饰,第一个参数是cls的方法

    1. class Square: # 定义一个正方形类
    2. angle = 90 # 类属性,正方形内角
    3. def __init__(self,length):
    4. self.length_value = length # 实例属性, 边长
    5. def get_perimeter(self): # 实例方法,周长
    6. p = self.length_value * 4
    7. return p
    8. def get_acreage(self): # 实例方法, 面积
    9. s = self.length_value ** 2
    10. return s
    11. '''在类内部,用@classmethod装饰,第一个参数为cls的方法为类方法'''
    12. @classmethod
    13. def get_twoAngle_sum01(cls): # 类方法,两个内角的和
    14. sum = cls.angle * 2 # 在类方法中访问类属性angle,可通过 cls.angle访问获取到值
    15. return sum
    16. @classmethod
    17. def get_twoAngle_sum02(cls): # 类方法,两个内角的和
    18. sum = Square.angle * 2 # 在类方法中访问类属性angle,也可通过 Square.angle访问获取到值
    19. return sum

    在类外部调用类方法
    1、通过实例调用类方法, 实例.类方法;
    2、通过类名调用类方法, 类名.类方法;

    1. class Square: # 定义一个正方形类
    2. angle = 90 # 类属性,正方形内角
    3. def __init__(self, length):
    4. self.length_value = length # 实例属性, 边长
    5. def get_perimeter(self): # 实例方法,周长
    6. p = self.length_value * 4
    7. return p
    8. def get_acreage(self): # 实例方法, 面积
    9. s = self.length_value ** 2
    10. return s
    11. @classmethod
    12. def get_twoAngle_sum01(cls): # 类方法,两个内角的和
    13. sum = cls.angle * 2 # 在类方法中访问类属性angle,可通过 cls.angle访问获取到值
    14. return sum
    15. @classmethod
    16. def get_twoAngle_sum02(cls): # 类方法,两个内角的和
    17. sum = Square.angle * 2 # 在类方法中访问类属性angle,也可通过 Square.angle访问获取到值
    18. return sum
    19. s1 = Square(3)
    20. sum_01 = s1.get_twoAngle_sum01() # 通过实例调用类方法, 实例.类方法
    21. sum_02 = Square.get_twoAngle_sum01() # 通过类名调用类方法, 类名.类方法
    22. print(sum_01)
    23. print(sum_02)

    试一下:sum_03 = Square(3).get_twoAngle_sum01() 是否也能实现调用类方法?
    在类内部调用类方法
    通过类名调用类方法, 类名.类方法

    class Square:  # 定义一个正方形类
    
        angle = 90  # 类属性,正方形内角
    
        def __init__(self, length):
            self.length_value = length  # 实例属性, 边长
    
        def get_perimeter(self):  # 实例方法,周长
            p = self.length_value * 4
            return p
    
        def get_acreage(self):  # 实例方法, 面积
            s = self.length_value ** 2
            sum02 = Square.get_twoAngle_sum02()
            return s,sum02
    
        @classmethod
        def get_twoAngle_sum01(cls):  # 类方法,两个内角的和
            sum = cls.angle * 2  # 在类方法中访问类属性angle,可通过 cls.angle访问获取到值
            sum02 = Square.get_twoAngle_sum02()
            return sum,sum02
    
        @classmethod
        def get_twoAngle_sum02(cls):  # 类方法,两个内角的和
            sum = Square.angle * 2  # 在类方法中访问类属性angle,也可通过 Square.angle访问获取到值
            return sum
    

    静态方法:在类内部,用@staticmethod装饰,第一个参数无要求

    class Square:  # 定义一个正方形类
    
        angle = 90  # 类属性,正方形内角
    
        def __init__(self, length):
            self.length_value = length  # 实例属性, 边长
    
        def get_perimeter(self):  # 实例方法,周长
            p = self.length_value * 4
            return p
    
        def get_acreage(self):  # 实例方法, 面积
            s = self.length_value ** 2
            sum02 = Square.get_twoAngle_sum02()
            return s,sum02
    
        @classmethod
        def get_twoAngle_sum01(cls):  # 类方法,两个内角的和
            sum = cls.angle * 2  # 在类方法中访问类属性angle,可通过 cls.angle访问获取到值
            sum02 = Square.get_twoAngle_sum02()
            return sum,sum02
    
        @classmethod
        def get_twoAngle_sum02(cls):  # 类方法,两个内角的和
            sum = Square.angle * 2  # 在类方法中访问类属性angle,也可通过 Square.angle访问获取到值
            return sum
        '''通过@staticmethod装饰的方法,为静态方法'''
        @staticmethod
        def get_total_angle(): # 类静态方法, 返回内角总和
            total_angle = Square.angle * 4 # 在类静态方法中访问类属性angle, 可通过 Square.angle 访问获取到值
            return total_angle
    

    在类外部,调用静态方法
    跟类方法调用方法一致
    1、通过实例调用类方法, 实例.类方法;
    2、通过类名调用类方法, 类名.类方法;

    class Square:  # 定义一个正方形类
    
        angle = 90  # 类属性,正方形内角
    
        def __init__(self, length):
            self.length_value = length  # 实例属性, 边长
    
        def get_perimeter(self):  # 实例方法,周长
            p = self.length_value * 4
            return p
    
        def get_acreage(self):  # 实例方法, 面积
            s = self.length_value ** 2
            sum02 = Square.get_twoAngle_sum02()
            return s,sum02
    
        @classmethod
        def get_twoAngle_sum01(cls):  # 类方法,两个内角的和
            sum = cls.angle * 2  # 在类方法中访问类属性angle,可通过 cls.angle访问获取到值
            sum02 = Square.get_twoAngle_sum02()
            return sum,sum02
    
        @classmethod
        def get_twoAngle_sum02(cls):  # 类方法,两个内角的和
            sum = Square.angle * 2  # 在类方法中访问类属性angle,也可通过 Square.angle访问获取到值
            return sum
        '''通过@staticmethod装饰的方法,为静态方法'''
        @staticmethod
        def get_total_angle(): # 类静态方法, 返回内角总和
            total_angle = Square.angle * 4 # 在类静态方法中访问类属性angle, 可通过 Square.angle 访问获取到值
            return total_angle
    
    
    s1 = Square(5)   # 实例化一个边长为5的正方形
    total_angle_01 = s1.get_total_angle()  # 通过实例调用静态方法, 实例.静态方法
    total_angle_02 = Square.get_total_angle() # 通过类名调用静态方法, 类名.静态方法
    print(total_angle_01)
    print(total_angle_02)
    

    在类内部,调用静态方法
    通过类名调用静态方法, 类名.静态方法

    class Square:  # 定义一个正方形类
    
        angle = 90  # 类属性,正方形内角
    
        def __init__(self, length):
            self.length_value = length  # 实例属性, 边长
    
        def get_perimeter(self):  # 实例方法,周长
            p = self.length_value * 4
            sum02 = Square.get_twoAngle_sum02()
            return p, sum02
    
        def get_acreage(self):  # 实例方法, 面积
            s = self.length_value ** 2
            sum02 = Square.get_twoAngle_sum02()
            total_angle = Square.get_total_angle() # 通过 类名.静态方法 进行调用
            return s,sum02, total_angle
    
        @classmethod
        def get_twoAngle_sum01(cls):  # 类方法,两个内角的和
            sum = cls.angle * 2  # 在类方法中访问类属性angle,可通过 cls.angle访问获取到值
            sum02 = Square.get_twoAngle_sum02()
            total_angle = Square.get_total_angle() # 通过 类名.静态方法 进行调用
            return sum,sum02, total_angle
    
        @classmethod
        def get_twoAngle_sum02(cls):  # 类方法,两个内角的和
            sum = Square.angle * 2  # 在类方法中访问类属性angle,也可通过 Square.angle访问获取到值
            return sum
        '''通过@staticmethod装饰的方法,为静态方法'''
        @staticmethod
        def get_total_angle(): # 类静态方法, 返回内角总和
            total_angle = Square.angle * 4 # 在类静态方法中访问类属性angle, 可通过 Square.angle 访问获取到值
            return total_angle