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) # 报错,实例不能访问私有变量

专有方法

类对象

支持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的类机制的更多相关文章

  1. Python虚拟机类机制之绑定方法和非绑定方法(七)

    Bound Method和Unbound Method 在Python中,当对作为属性的函数进行引用时,会有两种形式,一种称为Bound Method,这种形式是通过类的实例对象进行属性引用,而另一种 ...

  2. Python虚拟机类机制之instance对象(六)

    instance对象中的__dict__ 在Python虚拟机类机制之从class对象到instance对象(五)这一章中最后的属性访问算法中,我们看到“a.__dict__”这样的形式. # 首先寻 ...

  3. Python虚拟机类机制之从class对象到instance对象(五)

    从class对象到instance对象 现在,我们来看看如何通过class对象,创建instance对象 demo1.py class A(object): name = "Python&q ...

  4. Python虚拟机类机制之descriptor(三)

    从slot到descriptor 在Python虚拟机类机制之填充tp_dict(二)这一章的末尾,我们介绍了slot,slot包含了很多关于一个操作的信息,但是很可惜,在tp_dict中,与__ge ...

  5. Python虚拟机类机制之填充tp_dict(二)

    填充tp_dict 在Python虚拟机类机制之对象模型(一)这一章中,我们介绍了Python的内置类型type如果要完成到class对象的转变,有一个重要的步骤就是填充tp_dict对象,这是一个极 ...

  6. Python虚拟机类机制之对象模型(一)

    Python对象模型 在Python2.2之前,Python中存在着一个巨大的裂缝,就是Python的内置类type,比如:int和dict,这些内置类与程序员在Python中自定义的类并不是同一级别 ...

  7. Python虚拟机类机制之自定义class(四)

    用户自定义class 在本章中,我们将研究对用户自定义class的剖析,在demo1.py中,我们将研究单个class的实现,所以在这里并没有关于继承及多态的讨论.然而在demo1.py中,我们看到了 ...

  8. 《python解释器源码剖析》第13章--python虚拟机中的类机制

    13.0 序 这一章我们就来看看python中类是怎么实现的,我们知道C不是一个面向对象语言,而python却是一个面向对象的语言,那么在python的底层,是如何使用C来支持python实现面向对象 ...

  9. 【Python&数据结构】 抽象数据类型 Python类机制和异常

    这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Pyt ...

  10. 从C#到Python —— 4 类及面向对象

    http://www.cnblogs.com/yanxy/archive/2010/04/04/c2p_4.html 如果你熟悉C#,那么对类(Class)和面向对象(Object Oriented) ...

随机推荐

  1. 实战:Mailivery 模拟登录

    问题情景 混淆群内的小伙伴遇到这么个问题,Mailivery 这个网站登录后,明明提交的表单(邮箱和密码也正确).请求头等等都没问题,为啥一直重定向到登录页面呢?唉,该出手时就出手啊,我也看看咋回事吧 ...

  2. 《Django 5 By Example》阅读笔记:p651-p678

    <Django 5 By Example>学习第9天,p651-p678总结,总计28页. 一.技术总结 1.aggregate() (1)aggregate:ad-("to&q ...

  3. importlib 用法

    首先看一下importlib.import_module(name, package=None)函数的参数 函数调用存在两种方式: 1.绝对导入,name为完整路径str,package为None. ...

  4. 详解 Eclipse 中的快速 Java 编码(代码模板)

    http://hi.baidu.com/twlk28/blog/item/f3ca4d905f1c6696a877a462.html 简介: Eclipse 提供了通过定义和使用代码模板来提高工作效率 ...

  5. Clickhouse之集群操作

    查看集群: 在任意一台机上,使用 /usr/bin/clickhouse-client --host localhost --port 9000 连接本地服务器 select * from `syst ...

  6. Lnmp编译安装(2020)

    之前写过几篇有关安装lnmp环境的文章,现在回顾感觉有些比较老了或者并不是好的操作,于是更新这篇 1. 安装Nginx 1) 依赖安装 yum install gcc gcc-c++ openssl ...

  7. Educational Codeforces Round 90 (Rated for Div2)

    Donut Shops 现在有两个超市,第一个超市的物品按件卖,每件商品的售价为\(a\)元:第二个超市的物品按箱卖,每箱有\(b\)件物品,每箱售价为\(c\)元,现在要让你买\(x\)和\(y\) ...

  8. 从零开始学java(第一天)

    上班日学习时间很短,而且很多事情会耽搁,就会写的比较少 近几期的笔记以复习为主,后面会逐渐拓展对我个人来说的新知识 1. 复习了一下typore的语法,方便以后记笔记用 # MarkDown学习(# ...

  9. ae基于面要素生成柱状图

    IFeatureLayer fl = axMapControl1.get_Layer(0) as IFeatureLayer; IGeoFeatureLayer pGeoFeatLyr = fl as ...

  10. VTK 显示3D模型的网格线(线框/wireframe)

    在VTK9.1.0在Windows10+VS2019+Qt 5.15.2环境下编译安装的Qt例子中,想显示球体表面的网格线(线框/wireframe),设置actor的EdgeVisibilityOn ...