python是一门面向对象的语言,所以它拥有面向对象的相关基本功能,这里并不准备对面向对象长篇大论,只说一些python类和对象的一些特殊点,方便以后查阅。
1、类属性和对象属性要分清
在python中,一切皆对象,类自然也是对象,既然是对象,那就可以拥有自己的属性和方法
class ParentCls(object):
a = 10
def __init__(self):
self.c = 100
ins = ParentCls()
print(ParentCls.a) #-->10
print(ins.a) #-->10
print(ins.c) #-->100
print(ParentCls.c) #-->AttributeError: type object 'ParentCls' has no attribute 'c'
在上面的代码可以看出,ParentCls有属性a,ins有属性c,同时ins又可以使用ParentCls的属性a,但是ParentCls是不能使用ins的属性c的。
注意上面说的是使用而不是拥有,为什么呢,看下面的代码
ParentCls.a = 11
print(ParentCls.a) #-->11
print(ins.a) #-->11
那么要怎么样让ins也拥有属性a呢,很简单,python是动态语言,很容易添加属性
ins.a = 100
'''
从这一刻开始,ParentCls和ins都拥有各自的属性a,他们互不影响
'''
print(ParentCls.a) #-->11
print(ins.a) #-->100
ParentCls.a = 1000
print(ParentCls.a) #-->1000
print(ins.a) #-->100
是不是感觉跟作用域一样,不错,可以这么理解:ParentCls是一个全局作用域,ins是局部作用域,在局部作用域自然是可以使用全局作用域内定义的变量的,而一旦我们在局部作用域执行了 a=... 的时候,就代表定义了一个局部变量a,局部变量的a和全局变量的a就是两个a了。
2、保护属性和私有属性
保护属性以? _ 开头,私有属性以 __ 开头,保护属性只是在编码风格上不建议使用,实际上还是能调用的,私有属性会做矫直,在变量名前加上 _类名 ,所以用原名字是不能访问的
class ParentCls(object):
_a = 'hello'
__b = 'world'
ins = ParentCls()
print(ins._a) #-->Tip:Access to a protected member _a of a class
print(ins._ParentCls__b) #-->Tip:Unresolved attribute reference '_ParentCls__b' for class 'ParentCls'
输出:
hello
world
print(ins.__b) #-->AttributeError: 'ParentCls' object has no attribute '__b'
|