python中的scope和namespace
(1)namespace是名字和对象的映射,多数名称空间使用dict来实现,不同namespace中的名称没有关系。
(2)模块.xx, xx表示模块对象中的一个属性,可以是一个函数。
(3)scope是python程序的一个namespace可以直接访问的一个文本范围。
class
类定义与函数定义相似,通常在类中的语句都是函数定义def,当进入一个类定义时,一个新的namespace被创建,并被当做局部scope来使用。
参考博客:
https://blog.csdn.net/on_1y/article/details/8640012
1.class与isinstance
class A:
pass #pass不起任何作用,只占位
class B(A):
pass
isinstance(B(),A) #注意这里不能写成isinstance(B,A)
输出:
True
2.class
2.1类对象
class first: #建立了一个名叫first的类,并且一个新的namespace被创建
i=1 #在这个namespace中创建了一个名字i,也叫数据属性
def f(self): #在first类中定义了一个f函数,也叫方法
return "hello"
first.i #类对象的属性引用
输出:
1
x=first() #将类对象实例化,也就是再在类名first后面加上函数标记
x.i #使用函数的形式进行属性引用
输出:
1
class first:
def __init__(self,Ar,Br): #为类的实例化提供初始值,在类实例化时会自动调用init
#data,A,B都是属性
self.data=[]
self.A=Ar
self.B=Br
first.i #由于前后两个的类名相同,所以会被后面的覆盖掉
x=first(3,4) #类对象first实例化
输出:
__main__.first
x.A #对实例化后的first进行属性引用
输出:
3
x.B
输出:
4
x.data
输出:
class first: #建立了一个名叫first的类,并且一个新的namespace被创建
i=1 #在这个namespace中创建了一个名字i,也叫数据属性
def f(self): #在first类中定义了一个f函数,也叫方法
return "hello"
x=first() #实例化
x.f
输出:
<bound method first.f of <__main__.first object at 0x7f8f016830f0>>
x.f() #使用实例化first中的f方法
输出:
'hello'
first.f(x) #与前者等价
输出:
'hello'
注意:如果数据属性与方法名称相同,前者会覆盖后者,所以方法名最好大写,数据属性前加_,数据属性可以被方法引用,方法第一个参数是self,方法函数定义可以在类外
def F(self,x,y): #方法名称大写,且放在类定义外面
print(self.data) #在外面使用了class里面init的参数值
return min(x,y)
class c:
f=F #调用了外面的F方法
def __init__(self):
self.data=1
def G(self): #类c中的第二个方法
print(self.data) #不能只用data
return "hello"
h=G
x=c() #实例化
x.h()
输出:
1
'hello'
x.f(0,2)
输出:
1
0
2.2Exceptions类
class B:
pass
class C(B): #C继承了B
pass
class D(C): #D继承了C,也就是B,C,D是同个东西
pass
for c in [B,C,D]:
try:
raise c()
except D:
print("D")
except C:
print("C")
except B:
print("B")
2.3迭代器
class Reverse: #将self.data数据从后往前迭代输出
def __init__(self,data): #初始化中加了一个data
self.data=data
self.index=len(data)
def __iter__(self):
return self
def next(self,b):
if self.index==0:
raise StopIteration
print(b)
self.index=self.index-1
return self.data[self.index]
reverse=Reverse('abc') #实例化,Reverse的输入参数只看init中的参数
reverse.next(1) #next只看里面的参数,所以必须要有b
输出:
1
c
d=reverse.__iter__()
def reverse(data): #由于reverse函数中带有yield,所以这个函数变成了生成器,所以会自带next函数
for index in range(len(data)):
yield data[index] #return,yield只能放在函数里面
for char in reverse('abc'):
print(char)
输出:
a
b
c
[63]
data='abc'
for index in range(len(data)):
print(data[index])
输出:
a
b
c
本人现在的研究方向是:
图像的语义分割,如果有志同道合的朋友,可以组队学习
haiyangpengai@gmail.com qq:1355365561