我们继续接着类和对象这个话题聊。

1.类方法

使用装饰器@classmethod。第一参数必须是当前类对象,该参数名一般约定为「cls」,当然cls也可以换成其他名字,通过它来传递类的属性和方法(不能传实例的属性和方法)

如下场景:假设现有一个学生类和班级类,想要实现:执行班级人数增加的操作、获得班级总人数。

class Student():

sum = 0

def __init__(self, name, age): # 构造函数

self.name = name

self.age = age

self.__class__.sum += 1

print('当前班级总数为:' + str(self.__class__.sum))

def do_homework(self):

print('english homework')

@classmethod

def plus_sum(cls):

cls.sum +=1

print(cls.sum)

student1 = Student('石敢当',18)

Student.plus_sum()

student2 = Student('喜小乐',18)

Student.plus_sum()

student3 = Student('小明',18)

Student.plus_sum()

2.静态方法

使用装饰器@staticmethod,静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。

class Student():

sum = 0

def __init__(self, name, age): # 构造函数

self.name = name

self.age = age

self.__class__.sum += 1

print('当前班级总数为:' + str(self.__class__.sum))

@classmethod

def plus_sum(cls):

cls.sum += 1

print(cls.sum)

@staticmethod

def add(x,y):

print(Student.sum) #静态方法内部可以访问类方法

print('This is a static method')

student1 = Student('石敢当',18)

student1.add(1,2)

我的理解是,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。可以用静态方法的地方,都可以用类方法代替。但不要经常使用静态方法,因为和面向对象关联性很弱。

3.成员的可见性:公开和私有

默认情况下,Class内部创建的属性和方法,外部代码是可以通过实例调用直接操作的;但有时候为了保证封装性,我们不希望这些内部属性被外部直接访问。这就需要设置成员可见性。

设置方法:在属性或方法名前面添加两个下划线「__」,成员私有化的作用,确保外部代码不能随意修改对象内部的状态,增加了代码的安全性。

应用场景:定义一个学生类名,在这个类下面,定义分数这个对象,现要给每个学生打一个分数,如果我们允许从外部修改分数,那么如果分数修改为-1时,就与逻辑不符,所以,我们需要通过对变量私有化,以及在类的内部定义一个方法,通过对方法修改变量,就可以对输入的分数做出正确判断。

class Student():

sum = 0

def __init__(self, name, age):

self.name = name

self.age = age

self.__score = 0

self.__class__.sum += 1

def marking(self,score):

if score < 0:

score = 0 #不能给别人打负分

self.__score = score #公开变量私有化

print(self.name+'同学本次考试分数为:'+str(self.__score))

student1 = Student('石敢当',18)

student2 = Student('小诺',18)

student1.marking(59)

student1.__score = -1 #公开的public 私有的private 强行赋值

print(student1.__dict__) #

print(student1.__score) #python动态语言特性

# print(student2.__score) #报错

print(student2._Student__score)

4.总结

Python中的构造函数前面有双下划线,但它却可以从外部访问,因为在init的后面也有双下划线。所以,我们命名时不推荐使用__name__、__score__这样的形式。

双下划线的实例变量并不是一定不能从外部访问

在上面这段代码中,print(student1.__score)是可以打印出结果的,但print(student2.__score),我们可以通过之前讲过的.__dict__的方法看看内部储存情况。

那么,如果想继续对student2.__score访问,可以将代码改为student2._Student__score就可以实现对__score的访问了,所以说Python本身没有任何机制阻止你干坏事,一切全靠自觉。

python定义一个student类、有下面的_Python的类和方法——成员可见性相关推荐

  1. python定义一个student类、有下面的_Python基础(小白教程)之面向对象

    原标题:Python基础(小白教程)之面向对象 Python的类 > 在这门语言中,类使用 class 语句来定义.在类中包含了一系列语句,比如赋值语句,def 定义函数等.从面向对象的角度看, ...

  2. python定义一个student类_从零开始学Python-Day38-类和实例

    原标题:从零开始学Python-Day38-类和实例 面向对象编程中最重要的概念就是类(Class)和实例(Instance),其中"类"是抽象的模板,"实例" ...

  3. python定义一个列表存放52张扑克牌_Python 制作一副扑克牌,有趣的案例!

    之前在 <流畅的 Python >中看到一个例子比较有趣,所以整理一下通过本文分享给大家, 该案例是通过 Python 类属性创建一幅除去 大王.小王之后的 52 张扑克牌,并实现随机抽牌 ...

  4. linux python复制安装,复制一个Python全部环境到另一个环境,python另一个,导出此环境下安装的包...

    复制一个Python全部环境到另一个环境,python另一个,导出此环境下安装的包 导出此环境下安装的包的版本信息清单pipfreeze>requirements.txt联网,下载清单中的包到a ...

  5. python定义一个空数组_python数组 1_python 数组最后一个元素_python定义一个空数组 - 云+社区 - 腾讯云...

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 感悟: 1.python列表操作里不允许变量类型的指针2.case1类似于冒泡排 ...

  6. 使用python定义一个神经网络结构

    使用python定义一个神经网络 python定义一个神经网络是进行深度学习或者实现神经网络的基础,那么如果定义一个深度神经网络的结构呢? import numpy as np class Netwo ...

  7. Python -- 定义一个函数,判断输入的数是不是质数

    Python – 定义一个函数,判断输入的数是不是质数 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数,否则称为合数. #定义一个函数,判断该数是不是质数 def sum(n): ...

  8. 定义一个集合类setColour,要求元素为枚举类型值

    目录 题目 前言 集合的实现的两种方法: 枚举类型: 方式一 总体实现原理 各函数实现 构造函数 拷贝构造函数和赋值运算符重载 ">>"的 重载 "<& ...

  9. python 定义一个无限制的二维数组方法

    python 定义一个无限制的二维数组方法 自定义二维数组方式 n = int(input()) mapL = [list(map(int,input().split())) for _ in ran ...

最新文章

  1. 会说话的狗狗本电脑版_会说话的电脑有点酷!惠普星14帮你解锁“偷懒”新姿势_惠普 星 14 2020(i5 1135G7/16GB/512GB/MX450)_笔记本新闻...
  2. HDU - 5637 Transform (思维、bfs预处理)
  3. 动易SiteFactory CMS自动采集器 V2.0
  4. Keras下载的数据集以及预训练模型保存在哪里
  5. 如何利用大数据做金融风控? 原创 2016年11月24日 17:42:03 标签: 大数据 / 金融 / 风控 1594 导语:如何通过海量数据与欺诈风险进行博弈? 随着金融科技、科技金融等概念的
  6. shell 常用命令集合
  7. Linu的sftp环境搭建
  8. No package nginx available.
  9. Emacs取消键值绑定
  10. 揭秘:原来腾讯、网易、阿里竟是这样招人的……
  11. CCS12.0 安装并设置中文
  12. 初识python廖雪峰_廖雪峰Python教程[完整版]
  13. Android 设置背景透明度
  14. 每日算法刷题Day3-起始时间转换、二次方根、while连续输入、斐波那契思路
  15. t450加固态硬盘教程_联想 thinkpad t450s 加装固态硬盘及内存图解
  16. kaggle上面的E-Commerce Data数据集练习(可视化与部分特征工程)
  17. postman接口测试响应体出错显示HTML网页的问题
  18. 机器学习数据预处理之离群值/异常值:标准差法
  19. 利用Python进行数据分析
  20. Linux 基础上篇

热门文章

  1. lol服务器维护补偿,LOL官方:服务器崩溃补偿!全服再次免费赠送皮肤一款!
  2. 手机浏览器UA测试(三)
  3. 不同安卓模拟器连接appium的端口
  4. 踩坑日志:go并发读取文件
  5. 【Tools】抓包工具——Charles(中名:花瓶)
  6. 移动磁盘提示文件系统损坏要怎么恢复数据
  7. c++基础学习:输入cin、输出cout、换行endl
  8. Mac电脑使用:您的安全性偏好设置仅允许安装来自App Store和被认可的开发者的应用(解决方法)
  9. asp.net 打开服务器文件,aspnet打开服务器文件夹
  10. 蒙特卡洛算法及简单应用