Python()-类命名空间和对象/实例命名空间
2024-09-04 15:54:41
类命名空间和对象/实例命名空间:
创建类, 就会创建一个类的名称空间, 空间:存储类的属性
属性:
- 静态属性:直接定义在类下面 & 和类名关联 的变量
- 对象属性:在类内和self关联 & 类外和对象关联 的变量
- 动态属性:方法(函数)
内存空间的指向:
class Foo:
a = 1
b = ['big']
def __init__(self):
pass
f1 = Foo()
print(f1.a) # 1
f1.a = 2 # '=' 断开了类的指针,内存地址不在指向类中的a (从内存层面讲) , 指向了新开辟的空间
# 对象修改类的不可变数据类型,,只是赋值在对象自己的空间里增加一个新属性
print(f1.a) # 2 print(f1.b) # ['big']
f1.b.append('small') #没有断开,只是指向的列表append()
# 对象修改可变数据类型,全局生效
print(f1.b) # ['big', 'small']
========
class Foo:
def func(self):
return 100
f = Foo()
print(f.func())
f.func = 1 #修改成1, 对象自己创建了一个变量名是func = 1 的东西
print(f.func) #f.func 没有括号,是对象调用属性
print(Foo.func(f)) #如果还想用 100, 可以用类名.方法,self参数必须传进去一个对象
================
例子:统计类被调用的次数
class Foo:
count = 0
def __init__(self):
Foo.count += 1
f = Foo()
print(f.count) #1 Foo.count
f2 = Foo()
print(f2.count) #2 Foo.count
f3 = Foo()
print(f3.count) #3 Foo.count f = Foo()
f2 = Foo()
f3 = Foo()
print(f.count) # 3 Foo.count
print(f2.count) # 3 Foo.count
print(f3.count) # 3 Foo.count
===============================
题外:
class Foo:
count = 0
def __init__(self):
Foo.count += 1
def func(self):
a = 3
f = Foo()
print(Foo.func)
#<function Foo.func at 0x0000000001E68950>
print(f.func) 两个内存地址是不一样的,(因为bound绑定到对象,有个类的指针指向类的方法,不是直接去拿)
#<bound method Foo.func of <__main__.Foo object at 0x0000000001E67B38>>
================
命名空间:
- 静态属性: 属于类内部的命名空间
- 动态属性: 属于类内部的命名空间
- 对象属性: 属于对象的,在类内关联self ,类外关联对象名
查看静态属性: 类名.属性 对象.属性
调用类中的方法: 类名.方法名(传对象) ,对象.方法名()
对象能找到类,类找不到对象,单线联系
对象查找属性,现在自己空间找,找不到再去类空间去找
最新文章
- 【Centos】修改网卡名字&;随之出现的问题
- 【iOS自定义键盘及键盘切换】详解
- 【转】CV_EXPORT定义的作用,lib及dll的区别
- html5 drag and drop
- Java中自定泛型方法
- REST构架风格介绍:状态表述转移
- 高效的TCP消息发送组件
- 启用DHCP中继代理,实现跨子网服务 - Win 2003 Server
- CodeManage 源代码管理器v2.0发布
- Android应用中使用Popupmenu
- 【转】深入理解javascript原型和闭包(完结)
- ubuntu安装docker
- spark-2.4.0-hadoop2.7-高可用(HA)安装部署
- SpringBoot 整合 Dubbo 进行分布式开发
- 赋值,什么时候用value,什么时候用innerText
- Linux 下面 Sqlserver 2017 的简单安装
- nodejs 利用zip-local模块压缩文件夹
- git 服务器搭建及提交代码检查
- SVN入门教程
- Spark机器学习(5):SVM算法