021_面向对象的名称空间

1,类里面  能够定义两种属性:
      静态属性
      动态属性
class Course:
    language = 'Chinese'
    def __init__(self,teacher,course_name,period,price):
        self.teacher = teacher
        self.name = course_name
        self.period = period
        self.price = price
    def func(self):
        pass
Course.language = 'English'             #类的静态属性只能经过对象或类这种方式修改。不能经过字典
# Course.__dict__['language'] = 'Chinese'
# print(Course.language) 
2,命名空间
  2.1
  1. 类属性的命名空间是是共享的,而对象的属性命名空间,是每建立一个对象就开创一个本身的命名空间,只保存本身的对象属性,不保存类属性。各对象的命名空间相互独立。
  2. “类名.对象属性”  Course.name 是不能用的。由于类不能使用对象的属性的,对象须要类的属性时,能够向类寻找。
  3. 由于类的命名空间是各对象共享的,因此如经过“类名.类属性”修改类属性,那么依靠这个类建立的实例化对象中在调用其类属性都会相应改变。
  4. 若是,经过“对象名.类属性”则类命名空间的该类属性不会变(即共享空间的类属性不会变)可是,这个对象会将这个类属性添加到本身的命名空间,并将值修改,成为本身的对象属性。
    python = Course('egon','python','6 months',20000)
    linux = Course('oldboy','linux','6 months',20000)
    Course.language = 'Chinese'
    print(python.language)  #Chinese
    print(linux.language) #Chinese
    python.language = 'py'
    print(Course.language) #Chinese
    print(python.language) #py
    print(linux.language)   #Chinese
2.2
print(linux.__dict__) #查看linux对象名称空间的名称
print(python.__dict__) #查看python对象名称空间的名称

因而可知,python对象中多了一个属性,若是想让该属性依然跟着大众变化,就要 “del python.language”
del python.language
print(python.__dict__)
2.3
若是类属性是可变数据类型,那么经过对象修改可变数据类型中的一个元素,那么就是修改了这个可变数据类型的元素。又由于对象中找类属性,经过指向类中类属性的地址,
类属性又指向可变数据类型,列表的地址,而修改可变数据类型中元素,并不改变可变数据类型列表的地址,所以,经过对象修改可变数据类型的元素,就更改了类属
class Course:
	language = ['Chinese']
	def __init__(self,teacher):
		self.teacher = teacher

python = Course('egon')		#['Chinese']
linux = Course('oldboy')	#['Chinese']
python.language[0] = 'English'
print(Course.language)		#['English']
python = Course('egon')		#['English']
linux = Course('oldboy') 	#['English']
python.language = ['English']	#这样却不会修改类属性,由于这是创建一个新列表,一个新地址,和原列表不要紧。
python = Course('egon')  
linux = Course('oldboy')
2.4
# 类中的静态变量 能够被对象和类调用
# 对于不可变数据类型来讲,类变量最好用类名操做
# 对于可变数据类型来讲,对象名的修改是共享的,从新赋值是独立的
 
3,认识绑定方法
def func():pass
print(func)
class Foo:
    def func(self):
        print('func')
    def fun1(self):
        pass
f1 = Foo()
print(Foo.func)  #除了对象,其它的都不能和func造成绑定关系。
print(f1.func)   #f1.func就是将f1与func方法绑定
# print(f1.fun1)
#<bound method Foo.func of f1>

  

4,
  对象须要的去类里找,若是类里没有就没有,不会向全局找。
5,
  组合 :一个对象的属性值是另一个类的对象
相关文章
相关标签/搜索