Python学习笔记——私有化

一、类中的私有化

类中有私有属性,私有方法,对外保密,也不会被子类继承。

1、私有属性

下面我们就写个类。

class test(object):
    """docstring for test"""
    def __init__(self):
        super(test, self).__init__()
        self.__num = 100

私有属性__num,下面我们从外面调用下:

这里写图片描述

错误提示:test类没这个属性。

这时候我们一般的做法是暴露出来两个方法,get获取值方法,和set设置值方法。
如下:

这里写图片描述

这样我们就可以访问到了这个属性了。

(偷笑)
其实还有一种方法可以访问到。
就是直接调用。
在之前的直接调用中,为什么我们调用不到呢?
其实是因为Python偷偷的给我们把变量名给改了。

我们利用dir()命令查看这个类中所有的方法和属性。显示如下:

这里写图片描述

看到了么?箭头的标记。py君把私有变量名改为 “_类名+私有变量名” 了,在我这里就是 “_test__num”。下面我们再次调用试试。

这里写图片描述

看看是不是访问到了。不仅能访问,还能修改呢~(千万不要乱用这种方法哟)

2、私有方法

class test(object):
    """docstring for test"""
    def __init__(self):
        super(test, self).__init__()

    def __printName(self):
        print('sy')

t = test()

t.__printName()

运行如下:

这里写图片描述

错误提示:test类没这个属性。

私有方法仅限于在这个类中使用。

实质上也是py君改变了私有类的名称,我们用刚才的方法调用试试吧。

这里写图片描述

这种方法知道就好了,不要乱用哦~

二、模块中的私有化

我们先写个模块

num = 100

_num2 = 150

__num3 = 300

def printName():
    print('sy')

def _printName1():
    print('sy1')

def __printName1():
    print('sy2')

利用 from private import * 导入

(顺带复习下之前的import方法)

这里写图片描述

只要是带着”_”的,全部都是未定义错误。

那我们试试import private

这里写图片描述

这样就可以使用了。

我认为原因应该是在用 * 导入的时候,py君会自动过滤掉以 “_” 开头的属性和方法。
(我用 “_private__num2” 方法 也调用不到哟~)

如果直接将整个模块导入,以模块本身的角度是可以去调用模块内的所有属性和方法,包括私有的。

以上。

### Python 面向对象编程学习指南 #### 一、理解面向对象编程的概念及其在Python中的应用 Python支持多种编程范式,包括但不限于面向过程、面向对象以及函数式编程。对于小型应用程序而言,采用过程式的编程方式通常可以满足需求;然而,在处理中型至大型项目时,面向对象编程(OOP)能够提供显著的优势[^1]。 #### 二、定义类与创建对象实例 为了实现OOP理念,开发者可以通过`class`关键字来定义新的数据类型——即类(Class),并通过该类创建具体的数据实体——也就是对象(Object Instance)。下面是一个简单的例子展示了如何利用构造器(`__init__`)初始化新创建的对象属性: ```python class Student: def __init__(self, name, age, tel): self.name = name self.age = age self.tel = tel stu = Student("周杰伦", 31, "18500006666") print(stu.name) print(stu.age) print(stu.tel) ``` 这段代码片段说明了怎样通过自定义的构造方法设置成员变量,并成功打印出了学生的信息[^2]。 #### 三、封装机制下的访问控制 尽管Python并没有像其他一些语言那样严格的私有化规则,但是仍然允许程序员通过约定俗成的方式标记某些字段为“内部使用的”。这通常是通过给想要保护起来的方法或属性前面加上单个下划线(_)作为前缀来达成目的[^4]。 例如: ```python class Person: def __init__(self, first_name, last_name): self._first_name = first_name self._last_name = last_name def get_fullname(self): return f"{self._first_name} {self._last_name}" ``` 这里`_first_name` 和 `_last_name` 虽然不是真正意义上的私有成员,但在社区内普遍被认为是不应该被外部直接调用的部分。 #### 四、深入探索更多高级主题 除了上述基础知识点外,还有许多值得深入了解的内容,比如继承(Inheritance)、多态(Polymorphism)、组合(Composition)等重要概念。这些都构成了完整的面向对象设计模式体系结构的基础构件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值