1.  定义类

python中定义一个类的格式如下:

class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2 def __func1(self):
print("MyClass类的私有方法被调用!") def print_data(self):
self.__func1()
print(self.__data1)
print(self.data2) def setData(self,data):
self.__data1=data class1=MyClass('first_data','sencond_data')
class1.print_data()
class1._MyClass__func1()

类通过关键字 class 引导,后跟类的名称,通常第一个字母大写,类名称MyClass后的括号内的object表示该类的父类,如果定义的类没有显明从哪个类继承来的,就在括号内使用object,object类是所有类的父类。

__init__是定义的类的构造函数,可以对类的变量进行初始化,每当该类被实例化的时候,就会先执行该构造函数。

在类中定义的函数的一个参数一定要是self,代表类当前的实例化对象,但在调用时,不需要传递这个参数。

2. 类的实例

类的实例化方法如下:

obj=MyClass(x,x)

obj是类的实例化对象,MyClass是类名,括号内的变量是类的初始化变量(如果类中有定义的话)。

情况一: 类的初始属性为空

class MyClass(object):
def __init__(self):
print("MyClass类的构造方法被调用!") class1=MyClass()

情况二: 类含有初始属性

class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2 class1=MyClass('first_data','sencond_data')
print(class1.data2)


3. 类的封装

封装、继承和多态是类的三大特征。类的封装有两层含义,一个是对数据的封装,一个是对实现逻辑即方法的封装。

数据(属性)的封装

还看上一个例子:

class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2 class1=MyClass('first_data','sencond_data')
print(class1.data2)

在这里类MyClass的实例化对象class1就具有了两个属性,分别是data1和data2,data1是私有属性,只能在类内使用,data2是公有属性,可以在类外使用。data1和data2就是对数据(属性)的封装。

实现逻辑(方法)的封装

class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2 def printMax(self):
if self.__data1>self.data2:
print(self.__data1)
else:
print(self.data2) class1=MyClass(66,88)
class1.printMax()

上边类中的printMax函数实现了比较两个数据大小并打印的功能,这个实现逻辑在类外部来说是看不到的,只可以调用该接口,相当于一个黑箱子,这就是实现逻辑(方法)的封装。

4. 类的私有属性

可以在类内定义类的私有属性和方法,私有的表明只属于类内部的,在类外部是不可以直接访问的,python定义私有属性和私有方法的方法是在名称前加上两个下划线 “__”。

私有属性(变量)


class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2 class1=MyClass(66,88)
print(class1.data2)
print(class1.__data1)

上例中data2是公有变量,可以在类外访问,所有calss1.data2没有问题。 data1是类的私有属性,类外不可以访问,使用 class1.__data1会报错 'MyClass' object has no attribute '__data1' 。

私有方法


class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2 def __func1(self):
print("MyClass类的私有方法被调用!") def print_data(self):
self.__func1()
print(self.__data1)
print(self.data2) class1=MyClass(66,88)
class1.print_data()
#class1.__func1()

上例中 print_data方法是类的公有方法,可以在类外直接调用, __func1方法是类的私有方法,不可以在类外调用,但是可以通过类内的print_data方法调用私有的__func1方法,即私有的方法可以在类的内部被调用。

5. 类外访问类的私有属性

类的私有属性保证了外部代码不能随意访问/更改对象内部的数据和方法。

但是对类内私有属性,在类外仍然可以通过以下两种 方式进行访问和修改,一是通过类内的公有函数修改,一是“非法修改”。

通过类内的公有函数修改


class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2 def setData1(self,data):
self.__data1=data def printData1(self):
print(self.__data1) class1=MyClass(66,88)
class1.setData1(100)
class1.printData1()

非法修改

python中类的私有属性或方法之所以不能直接从类外部进行访问,是因为python解释器把私有的属性或方法 __xx 对外展示成了 _Class__xx,即单下划线+类名+__xx 。所以如果你执意,仍然可以在类外部通过这个改变后的名称“非法”访问私有属性。

class MyClass(object):
def __init__(self,data1,data2):
self.__data1=data1
self.data2=data2 def printData1(self):
print(self.__data1) class1=MyClass(66,88)
print(class1._MyClass__data1)

当然一般不建议这么干,不同的python编译器可能把私有属性/方法包装成不同的名字。

python中类的定义、实例化、封装以及私有变量/方法的更多相关文章

  1. 我的Python学习笔记(三):私有变量

    一.私有变量的定义 在Python中,有以下几种方式来定义变量: xx:公有变量 _xx:单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入 ...

  2. Objective-C 【继承、变量修饰符(私有变量/方法)、description方法】

    ------------------------------------------- 继承 一段代码: #import <Foundation/Foundation.h> @interf ...

  3. python 类的定义 实例化 实例完后初始化

    先来看看 类的__init__, 类的__new__ , 元类的__new__的执行顺序 class TMetaclass(type): def __new__(cls,name,bases,attr ...

  4. Python中类的定义及使用

    类是一些有共同特征和行为事务事物的抽象概念的总和. 从中可以看出,方法只能使用实例直接调用(无需传self参数),而使用类调用必须传入实例对象: 属性可以使用实例调用,也可以使用类直接调用,因此可以看 ...

  5. Python中类的定义与使用

    目标: 1.类的定义 2.父类,子类定义,以及子类调用父类 3.类的组合使用 4.内置功能 1.类的定义 代码如下: #!/usr/bin/env python #coding:utf8 class ...

  6. python中类的定义方法

    # coding =utf-8 ## 类的定义 ##-------------------------------------------------- class Employee: empCoun ...

  7. Python中类的定义

    class Student(object): # 有点类似其它高级语言的构造函数 def __init__(self,name,score): self.name = name self.score ...

  8. python 函数的定义及调用语法,map 方法,函数嵌套递归

    1.什么是函数    开发程序时候,需要代码执行多次,为了提高编写效率及代码重用性,所以把具有独立功能的代码块组织为一个小模块,给这个功能一个名称,这就是函数.    函数可以使用系统自带的函数也可以 ...

  9. python面向对象的三大特征--封装

    #coding:utf-8 __author__="tang" #第一个层面的封装:类就是麻袋,本身就是一种封装 #第二个层面的封装:类中定义私有的,只在类的内部使用,外部无法访问 ...

随机推荐

  1. 推荐使用sublime text 3 以及常用快捷键

    vim这种上古神器,需要学习.记忆.折腾.比如我的初衷是要开发php的,连php都没专研透,哪有精力去折腾vim这玩意. 当然,vim绝技练成以后,配置成各种IDE都不是问题,还有你手速会飞起来. 但 ...

  2. Tomcat 报错 记录

    Resource is out of sync with the file system: 该错误为替换了image中的图片而没有进行更新,造成找不到该资源,进而保存,解决只要eclipse刷新一下F ...

  3. 12) 十分钟学会android--APP通信传递消息之简单数据传输

    程序间可以互相通信是Android程序中最棒的功能之一.当一个功能已存在于其他app中,且并不是本程序的核心功能时,完全没有必要重新对其进行编写. 本章节会讲述一些通在不同程序之间通过使用Intent ...

  4. 【Oracle】删除undo表空间时,表空间被占用:ORA-30042: Cannot offline the undo tablespace

    特别注意:此办法只用于实在没有办法的时候,因为需要加入oracle中的隐含参数,慎用!!! 1. 先查一下是什么在占用undo SYS@ENMOEDU>select segment_name,o ...

  5. C# 4.0新加特性

    协变和逆变 这个在C#2.0中就已经支持委托的协变和逆变了,C#4.0开始支持针对泛型接口的协变和逆变: IList<string> strings = new List<strin ...

  6. VTK资料收集

    使用Qt Creator开发VTK 原文链接:http://blog.csdn.net/numit/article/details/10200507 VTK应用系列:非常强大!非常善良 05-VTK在 ...

  7. C++的Matlab接口

    与 原文 过程有些不同,根据具体环境自行配置即可! 转自于:http://blog.csdn.net/left_la/article/details/8206645 我的计算机环境是win7 64位系 ...

  8. 03--SQLtie三言两语SQLtie链接(join)

    本文将从连接的理论和语法讲起,结合具体的例子,详细分析 SQL 连接. 之前对数据库的连接操作似懂非懂,大概知道是什么东西,但是面试笔试的时候被虐成渣,讲不清连接到底是什么.吃一堑,长一智.这就是所谓 ...

  9. C# model代码生成器

    using System.Collections.Generic; using System.Text; public class Class1 { //传递 1.表名 2.列名 3.类型 publi ...

  10. 阿里云API网关!

    API 网关(API Gateway)提供高性能.高可用的 API 托管服务,帮助用户对外开放其部署在 ECS.容器服务等阿里云产品上的应用,提供完整的 API 发布.管理.维护生命周期管理.用户只需 ...