python 面向对象编程(1)

本文深入探讨了Python中类的属性与方法、继承、多态、魔法方法、运算符重载及类的展现,通过具体代码示例展示了如何创建和使用类,包括构造函数、私有属性的访问、类方法、属性装饰器、继承与多态的应用。

以下代码基于win 7 python3.7 验证通过

类的属性与方法

# -*- coding: utf-8 -*-
# class Programer:  # 旧式类

class ProgramerClass(object):  # 新式类, 日常开发中, 使用新式类, 若在python3.X, 则都是新式类
    hobby = "Play Computer"     # 类的属性

    def __init__(self, name, age, weight):   # 构造函数
        self.name = name    # 类的公共属性
        self._age = age     # 类的私有属性(但是还是可以访问的)
        self.__weight = weight  # 类的私有属性(需要用特殊的方法才能访问到)
    
    @classmethod     # 类方法, 调用的时候用类名, 而不是某个对象
    def get_hobby(cls):   # 这里是cls, 不是self
        return cls.hobby

    @property      # 像调用属性一样调用访求
    def get_weight(self):
        return self.__weight

    def self_introduction(self):   # 这个是类的方法
        print(f'My Name is {self.name}, \nI am {self._age} years old')
    
    def __del__(self):    # 析构函数 垃圾回收的时候被调用, 很不常用
    	pass

if __name__ == "__main__":
    programer = ProgramerClass("Albert", 25, 80)
    print(dir(programer))     # dir()是内建函数, 用来返回类的所有属性
    print(ProgramerClass.get_hobby())   # 展示<使用类名调用的方法>
    print(programer.get_weight)   # 展示<像调用属性一样调用方法>
    programer.self_introduction() # 展示<调用类的方法>
    print(programer.name)  # 公有属性的调用方法
    print(programer._age)  # 私有属性的调用方法
    print(programer._ProgramerClass__weight)  # 私有属性的调用方法

类的继承

  • 子类会继承父类的属性和方法
  • 也可以自定义,覆盖父类的属性和方法
  • 子类的类型判断
    • isinstance
    • issubclass
# -*- coding: utf-8 -*-
class ProgramerClass(object):
    hobby = "Play Computer"

    def __init__(self, name, age, weight):
        self.name = name
        self._age = age
        self.__weight = weight
    
    @classmethod
    def get_hobby(cls):
        return cls.hobby

    @property
    def get_weight(self):
        return self.__weight

    def self_introduction(self):
        print(f'My Name is {self.name}, \nI am {self._age} years old')


class BackendProgramer(ProgramerClass):

    def __init__(self, name, age, weight, language):
        self.language = language
        return super().__init__(name, age, weight)  # 继承父类的属性和方法(推荐使用)
        # super(BackendProgramer, self).__init__(name, age, weight) # 继承父类的属性和方法(第二种方法)
        
if __name__ == "__main__":
    backend = BackendProgramer('liu', 35, 75, 'python')
    print(dir(backend))
    print(backend.__dict__)
    print(type(backend))
    print(isinstance(backend, BackendProgramer))
    print(issubclass(BackendProgramer, ProgramerClass))
    print(backend.language)
    print(backend.name)
    print(backend._age)
    print(backend._ProgramerClass__weight)
    print(backend.hobby)

类的多态

  • 继承
  • 方法重写
# -*- coding: utf-8 -*-
class ProgramerClass(object):
    hobby = "Play Computer"

    def __init__(self, name, age, weight):
        self.name = name
        self._age = age
        self.__weight = weight
    
    @classmethod
    def get_hobby(cls):
        return cls.hobby

    @property
    def get_weight(self):
        return self.__weight

    def self_introduction(self):
        print(f'My Name is {self.name}, \nI am {self._age} years old')


class BackendProgramer(ProgramerClass):

    def __init__(self, name, age, weight, language):
        self.language = language
        super(BackendProgramer, self).__init__(name, age, weight)

        # return super().__init__(name, age, weight)

    def self_introduction(self):  # 这里重写了父类的同名方法
        print(f'My name is {self.name},\n my faverate language is {self.language}') 

if __name__ == "__main__":
    backend = BackendProgramer('liu', 35, 75, 'python')
    backend.self_introduction()

Magic Method

类与运算符

# -*- coding: utf-8 -*-

class Programer(object):

    def __init__(self, name, age):
        self.name = name
        if isinstance(age, int):
            self.age = age
        else:
            raise Exception('age must be int')

    def __eq__(self, other):
        if isinstance(other, Programer): # 判断是不是Programer的类型的
            if self.age == other.age:
                return True
            else:
                return False
        else:
            raise Exception('The type of object Must be Programer')


    def __add__(self, other):
        if isinstance(other, Programer):
            return self.age + other.age
        else:
            raise Exception('The type of object Must be Programer')

if __name__ == "__main__":
    p1 = Programer('Ali', 43)
    p2 = Programer('Ter', 33)
    print(p1 == p2)
    print(p1 + p2)

类的展现

- `__str__`
- `__repr__` 
- `__unicode__`
# -*- coding: utf-8 -*-

class Programer(object):

    def __init__(self, name, age):
        self.name = name
        if isinstance(age, int):
            self.age = age
        else:
            raise Exception('age must be int')
   
    def __str__(self):   # 可以注释掉,对比前后执行的结果
        return f'{self.name} is {self.age} years old'   # 返回自定义属性的字符

    def __dir__(self):  # 可以注释掉,对比前后执行的结果
        return self.__dict__.keys()   # 返回自定义属性

if __name__ == "__main__":
    p1 = Programer('Ali', 43)
    print(p1)
    print(dir(p1))

类的属性控制

# -*- coding: utf-8 -*-

class Programer(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __getattribute__(self, name):
        # return getattr(self.name)    # 错误的写法示例
        # return self.__dict__[name]  # 错误的写法示例
        return super().__getattribute__(name)  # 正确的写法
    
    def __setattr__(self, name, value):
        # setattr(self, name, value)   # 错误的写法示例
        self.__dict__[name] = value 	# 正确的写法

if __name__ == "__main__":
    p1 = Programer('Ali', 43)
    p1.name='Bli'
    print(p1.name)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值