Ⅰ、类属性、类方法(类和实例都能调用类属性和类方法)

类是一个特殊的对象,Python 中 一切皆对象:class AAA:      #定义的类属于 类对象obj1 = AAA()   #属于 实例对象
除了封装 实例 的 属性 和 方法外,类对象 还可以拥有自己的 属性 和 方法:·类属性·类方法(方法前面要加上@classmethod装饰器。不用实例化就可以执行类的方法)
通过 类名. 的方式可以 访问类的属性 或者 调用类的方法(方法的参数中要用cls参数且放到最前)
class A:a=1@classmethoddef aa(cls):print("这是类方法")
s=A()
print(A.a)#调用属性
1
A.aa()    #调用方法
这是类方法
print(s.a)
1
s.aa()
这是类方法class B:def __init__(self):self.a=1def aa(self):print("这是实例方法")
m=B()
>>>print(B.a)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: type object 'B' has no attribute 'a'
>>>B.aa()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: aa() missing 1 required positional argument: 'self'
>>>B.aa(m)#具体原因可以参考之前self的文章,请点入口1
这是实例方法
>>>print(m.a)
1
>>>m.aa()
这是实例方法

入口1

Ⅱ、私有属性与公有属性

在定义类的属性时,如果属性名以两个下划线“__”开头则表示是《私有属性》,否则是《公有属性》。
①私有属性在类的外部不能直接访问,需要调用对象的“公有成员方法”来访问,
或者
②通过python支持的特殊方式来访问。
Python提供了访问私有属性的特殊方式,可用于程序的测试和调试,对于成员方法也有同样性质。方法如下:对象名._类名+私有成员
例如:访问Car类私有成员__weight
car1._Car__weight
注意:私有属性是为了数据封装和保密而设的属性,一般只能在类的成员方法(类的内部)中使用访问,虽然Python支持一种特殊的方式来从外部直接访问类的私有成员,但是并不推荐这种做法。
#在类的成员方法(类的内部)中使用访问
class Car:price =1000                 #定义类属性,类和对象访问def __init__(self,c,w):self.color=c            #定义共有属性color,对象访问self.__weight=w         #定义私有属性__weight,类和对象都不能访问def siyou(self):return self.__weight
car1 = Car("red",10.5)
>>>print(Car.price)
1000
>>>print(Car.color)
Traceback (most recent call last):File "<input>", line 1, in <module>
AttributeError: type object 'Car' has no attribute 'color'>>>print(car1.price)
1000>>>print(car1.color)
red>>>print(car1.__weight)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'Car' object has no attribute '__weight'>>>print(car1.siyou())
10.5

Ⅲ、私有方法、公有方法

私有方法、公有方法都属于对象,私有方法的名字以两个下划线“__”开始,每个对象都有自己的公有方法和私有方法,在这两类方法中可以访问属于类和对象的成员;
①公有方法通过对象名直接调用,
②私有方法不能通过对象名直接调用,只能在属于对象的方法中通过“self”调用,或者外部通过Python支持的特殊方式来调用
class Test:def __test2(self):print("这是私有方法")def test(self):print("这是公有方法1")def _test(self):print("这是公有方法2")self.__test2()
t=Test()
>>>t.test()
这是公有方法1
>>>Test.test()
Traceback (most recent call last):File "<input>", line 1, in <module>
TypeError: test() missing 1 required positional argument: 'self'
>>>t._test()
这是公有方法2
这是私有方法
>>>t.__test
'Test' object has no attribute '__test'

Ⅳ、静态属性、类方法(上面提到过)、静态方法

一、静态属性

静态属性说的就是数据属性,把方法变成像属性一样调用

1、定义一个房间的类,求下这个房间的面积

class Room:def __init__(self,name,ower,width,length,heigh):self.Name=nameself.Ower=owerself.Width=widthself.Length=lengthself.Heigh=heighdef cal_area(self):print("%s 住的%s 总面积是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length))
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)#实例化第二个实例
r1.cal_area()#实例调用类的函数属性会自动传实例本身作为参数
r2.cal_area()#实例调用类的函数属性会自动传实例本身作为参数输出结果:北爷 住的厕所 总面积是4平米的地下室喵爷 住的北京 总面积是1200平米的地下室

1、1 property装饰器

class Room:def __init__(self,name,ower,width,length,heigh):self.Name=nameself.Ower=owerself.Width=widthself.Length=lengthself.Heigh=heigh@property #把一个方法变成一个数据属性def cal_area(self):print("%s 住的%s 总面积是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length))
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)
r1.cal_area#用了property这个装饰器之后,实例在调用函数属性就等于调用数据属性,不用加()就可以调用
r2.cal_area输出结果:北爷 住的厕所 总面积是4平米的地下室喵爷 住的北京 总面积是1200平米的地下室

1.2 这样还不行。因为正常的数据属性直接运行是没有返回值的
现在改为了直接return一个返回值,现在用起来的效果就是跟调用数据属性是一模一样的了,property这个装饰器就是把类的函数属性变为数据属性,也就是封装成了数据属性

class Room:def __init__(self,name,ower,width,length,heigh):self.Name=nameself.Ower=owerself.Width=widthself.Length=lengthself.Heigh=heigh@property #把一个方法变成一个数据属性def cal_area(self):# print("%s 住的%s 总面积是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length))# return (self.Width * self.Length)return "%s 住的%s 总面积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length)
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)
print(r1.cal_area)#用了property这个装饰器之后,实例在调用函数属性就等于调用数据属性,不用加()就可以调用
print(r2.cal_area)
print(r1.Name)#调用r1这个实例的数据属性
print(r2.Name)#调用r2这个实例的数据属性#输出结果:北爷 住的厕所 总面积是4平米的地下室喵爷 住的北京 总面积是1200平米的地下室厕所北京

二、python给我们提供了classmethod这个装饰器,只要用了这个方法, 就表示这个装饰器下面的方法是专门给类用的

这个方法就是只是类在调用类的方法,跟实例没关系,只要加了classmethod就只能供类调用

class Room:tag=1#定义一个类的数据属性def __init__(self,name,ower,width,length,heigh):self.Name=nameself.Ower=owerself.Width=widthself.Length=lengthself.Heigh=heigh@classmethod#这个装饰器是专门供类使用的方法def tell_info(cls):#cls代表类本身print(cls)print("---",cls.tag)#等价于Room.tag
Room.tell_info()#会自动把类本身传给cls#输出结果<class '__main__.Room'>--- 1

三、静态方法 叫类的工具包,不跟类绑定也不跟实例绑定。也就是说都能用

class Room:tag=1#定义一个类的数据属性def __init__(self,name,ower,width,length,heigh):self.Name=nameself.Ower=owerself.Width=widthself.Length=lengthself.Heigh=heigh@classmethod#这个装饰器是专门供类使用的方法def tell_info(cls):#cls代表类本身print(cls)print("---",cls.tag)@staticmethod#静态方法  叫类的工具包,不跟类绑定也不跟实例绑定def wash_body(a,b,c):print("%s %s %s 正在洗澡" %(a,b,c))
Room.wash_body("北爷","喵爷","修电脑")#用类调用washbody这个方法
r1=Room("厕所","北爷",2,2,20000)#实例化一个实例r1
r1.wash_body("北爷","喵爷","修电脑")#用实例调用washbody这个方法#输出结果:
北爷 喵爷 修电脑 正在洗澡北爷 喵爷 修电脑 正在洗澡

总结:

静态属性:property类和实例都可以访问静态属性(把函数封装成一个数据属性,让外面的人感受不 到是调用的函数属性)

类方法: classmethod类访问类方法,实例也能访问类方法

静态方法:staticmethod 用类可以调用静态方法,实例也可以调用静态方法不跟类和实例绑定,只叫类的工具包

Ⅴ、python的命名规范

python中有几种比较有意思的命名的方式,__xxx____name_name、,下面分别说它们的用处。

【__xxx__】

在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”(魔术方法),是可以直接访问的。例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中有相应描述

def __init__(self, name)

魔术方法大全,大家可以点这里参考一下

【__name】

双下划线开头,表示的是私有变量,为了让内部属性不被外部访问。

【_name】

_xxx被看作是“私有的”,在模块外不可以使用,在类外可以用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。单下划线 开始的成员变量叫做保护变量,意思是只有本模块、类、对象和子类对象自己能访问到这些变量,被导入时,该变量不能引用;

类属性、类方法;私有属性、公有属性;私有方法、公有方法;静态属性、静态方法;python的命名规范__xx__\__xx\_xx(自用笔记)相关推荐

  1. PHP中普通方法如何调用静态属性,php中的静态属性和静态方法如何调用

    静态属性.方法(包括静态与非静态)在内存中,只有一个位置(而非静态属性,有多少实例化对象,就有多少个属性). (推荐教程:php图文教程) 实例: header("content-type: ...

  2. C++_类和对象_C++多态_多态的基本语法_静态多态_动态多态_虚函数---C++语言工作笔记069

    然后我们再来看看C++中的多态,这里还要注意一点,就是在C++中是可以用多继承的, 但是java.不行,只能实现多个接口,不能继承多个类.这让c++会更加灵活一点. 可以看到,上面说了,在c++中,分 ...

  3. 初学者python笔记(静态属性、类方法、静态方法、类的组合)

    文章目录 类的三大方法 1.静态属性 2.类方法.静态方法 3.三大方法总结 类的组合 1.用法分析 2.面试案例分析 本篇文章是上一篇:初学者python笔记(面向对象编程.类与对象)的后续篇,是关 ...

  4. MobX基础 ----- 类的静态属性和装饰器

    当我们使用MobX的时候,首先要声明一个store, 用来保存状态,它的最基本的语法 如下: class Todo {@observable title = "";@observa ...

  5. php中如何声明静态属性,PHP使用static关键字声明静态属性和静态方法

    PHP使用static关键字声明静态属性和静态方法 在PHP中,通过static关键字修饰的成员属性和成员方法被称为静态属性和静态方法. 静态属性和静态方法不需要在被类实例化的情况下就可以直接使用. ...

  6. java实例属性_Java 静态属性与实例属性的初始化

    类的初始化包括静态属性的初始化和实例属性的初始化,在加载类过程中的准备阶段会给静态属性分配存储空间,并根据属性的类型设置初始值,例如 int 类型静态属性会设置初始值为 0,布尔类型静态属性会设置初始 ...

  7. java静态方法求n,java之静态属性和静态方法

    前言 静态属性和方法必须用static修饰符 static 可以修饰属性.方法.代码块.内部类 静态属性和非静态属性的区别: 1.在内存中存放位置不同   所有带static修饰符的属性或者方法都存放 ...

  8. 静态属性、静态方法、静态代码块

    1.什么是静态属性.静态方法 用static修饰符修饰的属性和方法叫作静态属性和静态方法 静态属性和非静态属性的区别: 1.在内存中存放的位置不同:所有static修饰的属性和方法都存放在内存的方法区 ...

  9. 歌谣学前端之静态属性

    前言 我是歌谣 我有个兄弟 巅峰的时候排名c站总榜19 叫前端小歌谣 曾经我花了三年的时间创作了他 现在我要用五年的时间超越他 今天又是接近兄弟的一天人生难免坎坷 大不了从头再来 歌谣的意志是永恒的 ...

最新文章

  1. openJDK之sun.misc.Unsafe类CAS底层实现
  2. SQL Server2016 原生支持JSON
  3. NumPy来自现有数据的数组
  4. VTK:InfoVis之PassThrough
  5. 工具类用得好,下班下的早
  6. 2. Mysql数据库的入门知识
  7. 小程序 循环中有多个input,怎么获取每个input输入框的值
  8. 高可用MySQL MHA介绍
  9. php table转json,html table表数据转Json格式示例代码分析
  10. 对话英特尔高级副总裁 Raja:软件将为硬件释放无限潜力
  11. 请求发送者与接收者解耦——命令模式(四)
  12. 计算机键盘能直接接手机吗,手机变电脑!智能手机外接键盘和鼠标的3种方法...
  13. Bootstrap之折叠(Collapse)
  14. segmentation fault(core dump);Run-Time Check Failure #3 -The variable 'p' is being used without bein
  15. [Java] 类和对象(简介,封装,内存机制,构造方法)
  16. 来世还做Java_“此生无悔入华夏,来世还做中国人”原话是什么?出自哪?
  17. 虚拟化技术-Qemu-KVM
  18. 公安专业知识--哔哩桐老师
  19. kubernetes-v1.15.0安装【使用kubeadm部署Kubernetes-跳过国内网络问题】
  20. SharedPreferences 使用方法详解

热门文章

  1. Deepin下tftp客户端传送升级文件失败问题分析
  2. linux 打印输出重定向的问题
  3. 360 开源企业级 Kubernetes 多集群管理平台 Wayne
  4. Linux驱动技术(三) _DMA编程
  5. 冒泡排序--通过冒泡算法让数组中最大的值成为数组中最后一个值
  6. win8桌面壁纸路径
  7. 在 Linux 系统中安装Load Generator ,并在windows 调用
  8. linux bash 学习
  9. 无废话ExtJs 入门教程二十三[员工管理实例:Demo]
  10. 鸟哥的Linux私房菜基础学习篇(第二版)第二章课后习题与答案