Python编程:class类面向对象

简介: Python编程:class类面向对象

创建类

class Employee(object):
    """所有员工的基类"""
    empCount = 0  # 类变量
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Employee.empCount += 1
    def displayCount(self):
        print("Total Employee %d" % Employee.empCount)
    def displayEmployee(self):
        print("Name: %s Salary: %d" % (self.name, self.salary))
# 创建 Employee 类的对象
employeeA = Employee("Tom", 2000)
employeeB = Employee("Jack", 2500)
employeeC = Employee("Jimi", 3000)
# 访问数据成员
# 访问类变量
print(Employee.empCount)  # 使用类名称访问类变量  3
# 访问实例变量
# 添加,删除,修改类的属性
employeeA.age = 23  # 添加
employeeA.age = 24  # 修改
del employeeA.age  # 删除
setattr(employeeB, "age", 25)  # 设置属性,不存在则新建
print(hasattr(employeeB, "age"))  # 检查属性存在  True
print(getattr(employeeB,"age"))  # 访问对象属性  25
delattr(employeeB, "age")  # 删除属性
# 访问对象方法
employeeA.displayCount()  # Total Employee 3
employeeA.displayEmployee()  # Name: Tom Salary: 2000 
employeeB.displayEmployee()  # Name: Jack Salary: 2500
employeeC.displayEmployee()  # Name: Jimi Salary: 3000
# 内置类属性
print(Employee.__doc__)  # 打印类文档  所有员工的基类
print(Employee.__name__)  # 类名  Employee
print(Employee.__module__)  # 类定义所在的模块  __main__
print(Employee.__base__)  # tuple 类的所有父类<class 'object'>
print(Employee.__dict__)  # dict 类的属性(由类的数据属性组成)
"""
{
    '__dict__': <attribute '__dict__' of 'Employee' objects>, 
    '__init__': <function Employee.__init__ at 0x0000000001263A60>, 
    '__weakref__': <attribute '__weakref__' of 'Employee' objects>,
    '__module__': '__main__', 
    '__doc__': '所有员工的基类', 
    'empCount': 3, 
    'displayCount': <function Employee.displayCount at 0x0000000001263AE8>, 
    'displayEmployee': <function Employee.displayEmployee at 0x0000000001263E18>
}
"""

self代表类的实例,而非类

class Test(object):
    def prt(self):
        print(self)
        print(self.__class__)
t1 = Test()
t2 = Test()
t1.prt()
"""
<__main__.Test object at 0x000000000120C550>
<class '__main__.Test'>
"""
t2.prt()
"""
<__main__.Test object at 0x000000000120C518>
<class '__main__.Test'>
"""
print("="*50)

对象销毁

引用计数器,循环垃圾收集器
class Point(object):
    def __init__(self, x , y): # 构造函数
        self.x = x
        self.y = y
    def __del__(self):  # 析构函数 
        class_name = self.__class__.__name__
        print(class_name, "销毁")
p1 = Point(1, 4)
p2 = p1
p3 = p1
print(id(p1), id(p2), id(p3))  # 打印对象的id
# 18991312 18991312 18991312
del p1
del p2
del p3
# Point 销毁
print("="*50)


image.pngimage.png

image.png

类的继承

面向对象的编程好处之一是代码重用

在python中继承中的一些特点:

1. 在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。

2. 在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。

区别在于类中调用普通函数时并不需要带上self参数

3. Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,

它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

如果在继承元组中列了一个以上的类,那么它就被称作”多重继承” 。


# 父类
class Parent(object):
    parent_attr = 10
    def __init__(self):
        print("Parent init")
    def parent_method(self):
        print("parent_method")
    def method(self):
        print("method of parent")
    def set_attr(self, attr):
        Parent.parent_attr = attr
    def get_attr(self):
        return Parent.parent_attr
# 子类
class Child(Parent):
    def __init__(self):
        print("Child init")
    def child_method(self):
        print("Child_method")
    def method(self):  # 重写父类方法
        print("method of child")
child = Child()        # 实例化子类  Child init
child.child_method()   # 调用子类的方法  Child_method
child.parent_method()  # 调用父类方法  parent_method
child.method()         # 子类调用重写方法  method of child
child.set_attr(20)     # 设置属性值
print(child.get_attr()) # 获取属性值  20
# 判断A是B的子类
print(issubclass(Child, Parent))  # True
# 判断A是B的实例
print(isinstance(child, Child))  # True

重载方法

class Student(object):
    def __init__(self, name, age):  # 构造函数
        self.name = name
        self.age = age
    def __del__(self):  # 析构方法, 删除一个对象del调用
        print("del")
    def __str__(self):  # 用于将值转化为适于人阅读的形式 str(obj)
        return "name:"+self.name+";age:"+str(self.age)
    __repr__ = __str__  # 转化为供解释器读取的形式
    def __cmp__(self,student):  #对象比较,用于排序   py3中删除
        if self.age > student.age:
            return 1
        elif self.age < student.age:
            return -1
        else:
            return 0
    def __add__(self, student):  # 运算符重载+
        return Student(self.name,self.age+student.age)
student1 = Student("Tom", 23)
student2 = Student("Jack", 25)
student3 = Student("Jimi", 24)
print(repr(student1))  # name:Tom;age:23
print(str(student1))  # name:Tom;age:23
print(student1)  # name:Tom;age:23
print(student1+student2) # name:Tom;age:48

类中数据的可访问性

class Counter(object):
    public_count = 0  # 类公有变量
    __private_count = 0  # 类私有变量
    def count(self):
        self.public_count += 1  # 实例公有变量
        self.__private_count += 1  # 实例私有变量
        print(self.__private_count)
counter = Counter()  # 实例化
counter.count() # 1
counter.count() # 2
print(counter.public_count) # 访问实例公有变量  2
# print(counter.__private_count)  # 访问实例私有变量  报错
print(counter._Counter__private_count) # 访问实例私有变量  2
print(Counter.public_count) # 访问类公有变量  0 
# print(Counter.__private_count)  # 访问类私有变量 访问出错
"""
单下划线:protected,本身和子类
双下划线:private,本身
头尾双下划线:系统定义特殊方法
"""

参考文章《Python 面向对象》

相关文章
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
319 102
|
3月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
345 104
|
3月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
276 103
|
3月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
206 82
|
2月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
219 3
|
2月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
483 3
|
2月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
300 3
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
312 0
|
3月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的多面手
Python:现代编程的多面手
93 0

推荐镜像

更多