首页 > 编程语言 >python的类机制

python的类机制

时间:2024-02-19 22:59:37浏览次数:26  
标签:__ python self init print 机制 class def

python的类机制

参考:python面向对象

概念

  1. 方法重写/覆盖:若从父类继承的方法不能满足子类的需求,可以对其进行改写。
  2. 类变量:在实例化对象中是公用的,定义在类中,且在函数体之外,通常不作为实体变量使用。
  3. 局部变量:定义在方法中的变量,只作用在当前实例。
  4. 实例变量:在类的声明中,属性是用变量表示的,用self修饰。
  5. 继承关系:派生对象”是一个“继承对象,例如Dog是一个Animal。
  6. 对象:通过类定义的数据结构实例,包含类变量、实例变量和方法。

类属性

  1. 私有属性

两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。例如:__private_attrs,在类内部的方法中使用时 self.__private_attrs

  1. 私有方法

两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。例如:__private_methods,使用方法:self.__private_methods。

#!/usr/bin/python3
 
class JustCounter:
    __secretCount = 0  # 私有变量
    publicCount = 0    # 公开变量
 
    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print (self.__secretCount)
 
counter = JustCounter()
counter.count()
counter.count()
print (counter.publicCount)
print (counter.__secretCount)  # 报错,实例不能访问私有变量

专有方法

image-20240219223255800

类对象

支持2种操作:

  1. 属性引用:对象.属性
  2. 实例化
class MyClass:
    """一个简单的类实例"""
    i = 12345
    def f(self):
        return 'hello world'
 
# 实例化类
x = MyClass()
 
# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())
# 输出
MyClass 类的属性 i 为: 12345
MyClass 类的方法 f 输出为: hello world

构造方法:

类中有一个__init__() 方法,在类实例化时(x = MyClass())会自动调用:

def __init__(self):
    self.data = []

和java一样,当没有定义的时候,会自动生成,也可以有参数,进而能传递到类的实例化操作上:

class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i)   
# 输出
3.0 -4.5

类方法:

类方法不同于普通函数之处:必须有一个额外的第一个参数名称,通常为self或者this,也可以是任意词。

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
 
t = Test()
t.prt()
# 输出
<__main__.Test instance at 0x100771878>
__main__.Test
  • self代表的是类的实例,表示当前对象的地址,self.class表示类。
#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁,%d kg。" %(self.name,self.age,self.__weight))

# 实例化类
p = people('runoob',10,30)
p.speak()
# 输出
runoob 说: 我 10 岁,30 kg。

继承

子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。

单继承

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))

s = student('ken',10,60,3)
s.speak()
# 输出
ken 说: 我 10 岁了,我在读 3 年级

多继承

若父类中有相同方法名,在子类使用时未指定,则从左到右查找父类中是是否包含该方法。

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))

#另一个类,多继承之前的准备
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))

#多继承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)

test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,默认调用的是在括号中参数位置排前父类的方法
# 输出
我叫 Tim,我是一个演说家,我演讲的主题是 Python

方法重写

super() 函数是用于调用父类(超类)的一个方法。

class Parent:        # 定义父类
   def myMethod(self):
      print ('调用父类方法')

class Child(Parent): # 定义子类
   def myMethod(self):
      print ('调用子类方法')

c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
# 输出
调用子类方法
调用父类方法

参考:Python 子类继承父类构造函数说明

运算符重载

__str__ 是一个类的方法,在打印类对象,获取其属性信息时调用。打印一个实例化对象时,默认打印的其实时一个对象的地址但是我们可以对其进行重载,打印我们想要的信息

class Vector:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    # 专有方法
    def __str__(self):
        return 'Vector (%d, %d)' % (self.a, self.b)
    # 加法运算符重载
    def __add__(self,other):
        return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)
# 输出
Vector (7, 8)

标签:__,python,self,init,print,机制,class,def
From: https://www.cnblogs.com/pam-sh/p/18022107

相关文章

  • OpenHarmony—ArkTS卡片运行机制
    实现原理图1ArkTS卡片实现原理卡片使用方:显示卡片内容的宿主应用,控制卡片在宿主中展示的位置,当前仅系统应用可以作为卡片使用方。卡片提供方:提供卡片显示内容的应用,控制卡片的显示内容、控件布局以及控件点击事件。卡片管理服务:用于管理系统中所添加卡片的常驻代理服务,提供......
  • Python asyncio
    asyncio作用提供了对携程的支持非阻塞:协程允许在等待异步操作的同时执行其他任务,而不会阻塞整个程序。轻量:相对于线程和进程,协程的开销较小,因为它们在单线程中执行。使用async/await语法:asyncdef声明协程函数,await用于等待异步操作的完成。事件循环:协程需要在事件循环......
  • Python生成词云--豆瓣电影短评(初学菜鸡版)
    Python生成词云--豆瓣电影短评(初学菜鸡版)目录Python生成词云--豆瓣电影短评(初学菜鸡版)1.主要涉及的库2.获取数据3.生成词云图1.主要涉及的库主要页面处理selenium数据处理,输出、读取CSVpandas、numpy对所有数据进行分词处理jieba处理图片,生成词云图word......
  • Python异步编程原理篇之IO多路复用模块selector
    selector简介selector是一个实现了IO复用模型的python包,实现了IO多路复用模型的select、poll和epoll等函数。它允许程序同时监听多个文件描述符(例如套接字),并在其中任何一个就绪时进行相应的操作。这样可以有效地管理并发I/O操作,提高程序的性能和资源利用率。本篇主要......
  • Python Paramiko模块-exec_command() 和 invoke_shell() 两种操作方式
    前言Paramiko是Python语言的一个SSH客户端。可以远程连接Linux服务器,通过python对Linux进行操作,可以实现进行对远程服务器进行下载和上传文件操作。exec_command()操作importparamikossh=paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAd......
  • Python用GAN生成对抗性神经网络判别模型拟合多维数组、分类识别手写数字图像可视化
    全文链接:https://tecdat.cn/?p=33566原文出处:拓端数据部落公众号生成对抗网络(GAN)是一种神经网络,可以生成类似于人类产生的材料,如图像、音乐、语音或文本。最近我们被客户要求撰写关于GAN生成对抗性神经网络的研究报告,包括一些图形和统计输出。近年来,GAN一直是研究的热门话题。F......
  • python实战:用SQLAlchemy作orm
    一,安装SQLAlchemy1,用pip安装(venv)[liuhongdi@imgnews]$pip3installsqlalchemy2,安装完成后查看已安装的版本:(venv)[liuhongdi@imgnews]$pip3showsqlalchemyName:SQLAlchemyVersion:2.0.27Summary:DatabaseAbstractionLibraryHome-page:https://www......
  • python pyKafka
    1importjson2importtraceback3fromdatetimeimportdatetime4importtime5frompykafkaimportKafkaClient6fromutilsimport*78#生成报文信息:process_message_event报文9defcreate_data():10data={11"mess......
  • 基于python+django+vue.js开发的学生成绩管理系统
    功能介绍平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。功能包括:成绩管理、学生管理、课程管理、班级管理、用户管理、日志管理、系统信息模块。源码地址https://github.com/geeeeeeeek/python_score演示地址http://score.gitapp.cn演示......
  • 基于python+django+vue.js开发的社区养老管理系统
    功能介绍平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。功能包括:老人管理、护工管理、亲属管理、病史管理、房间管理、活动管理、用户管理、日志管理、系统信息模块。源码地址https://github.com/geeeeeeeek/python_yanglao演示地址http:/......