day23 01 类的命名空间
day23 01 类的命名空间
一、初识面向对象复习
定义类:
class
函数:方法 动态属性
变量:类属性 静态属性
过程:
(1)_init_方法:初始化:def _init_(self,参数)
python帮我们创建了一个对象self
每当我们调用类的时候就会自动触发这个方法
在_init_方法里面可以对self进行赋值
self是什么:self拥有属性都属于对象
在类的内部,self就是一个对象
比如:someone=person(),someone.walk==person.walk(someone),括号里面就是类里面的walk方法所传的参数self,
而且这个参数必须传
(2)实例化:对象=类(参数是_init_方法的)
实例==对象 没有区别
对象查看属性:对象.属性
对象调用方法:对象.方法名(参数)==类名.方法名(对象名,参数)
(3)实例:
求正方形的周长和面积:
class square: def __init__(self,side_len): self.side_len_=side_len def perimeter(self): return self.side_len_*4 def area(self): return self.side_len_**2 s=square(6) print(s.perimeter()) print(s.area())
运行结果:
24 36
为什么计算这个周长和面积要使用类的调用和方法呢?
正方形不同的地方就是边长不一样,不同的边长的正方形就归为一类
有了固定的边长,当调用类里面的方法的时候就不需要再传参数了:print(s.perimeter()) , print(s.area())都不需要再传参数
何为python入门,面向对象入门:
python 入门:当你见到一个需求,你能翻译成python语言
面向对象入门:当你见到一个需求,你能分析这个需求适不适合使用面向对象解决,如果适合,你能有一些想法
二、类和对象的命名空间
类里面可以定义两种属性:
静态属性:
动态属性:
定义一个类:一种课程course,属性有:老师,课程名字,课程时间,课程费用
class course: language='chinese' def __init__(self,teacher,course_name,period,price): self.teacher=teacher self.course_name=course_name self.period=period self.price=price def func(self): pass python=course('李白','python','六个月','10000') print(python.teacher) print(python.course_name) print(python.period) print(python.price) course.language='english' #直接类名.静态属性是可以修改静态属性的 print(course.language) course.__dict__['language']='english' #但是使用类的字典形式去修改静态属性是不可能的,会报错 print(course.language) print(python.language) #使用对象调用和查看类下的静态属性是可以的
运行结果:
traceback (most recent call last): 李白 file "<encoding error>", line 31, in <module> python typeerror: 'mappingproxy' object does not support item assignment 六个月 10000 chinese english
为什么对象可以直接调用查看类下的静态属性呢?
print(python.language)---可以且不会报错
类下的命名空间有:language, _init_, func
对象self里面的命名空间有:teacher, course_name, period, price
类对象指针(内存地址可以有对象的指向类的):可以根据对象属性找到对应的类,但是不能根据类找到对应的对象属性
python.language:首先会在python里面找,如果找不到就会向对应的类中找,找到了就可以调用查看了
course.name:是找不到的
假设多加一门课程linux:
python=course('李白','python','六个月','10000') linux=course('秋白','linux','六个月','10000')
没有改变类下的静态属性language,然后打印
print(python.language) print(linux.language)
是都可以打印出来的,且都是chinese,而当通过
course.language='english'
修改静态属性之后,再次打印
print(python.language) print(linux.language)
结果也都会随之改变,都会变成english,当只通过对象修改类下的静态属性,在打印也是可以改的,如下:
python.language='english' print(python.language)
但是这样的改法实际上是在python对象下创建了一个新的language=‘english’,所以再python里面可以找得到,就不会继续往类下面去找,
但是在类下和linux下面(linux指向的是类的命名空间)并没有创建新的language,所以当打印
print(linux.language) print(course.language)
的结果还是原来的language的结果,即chinese所以:
注意:对于不可变的数据类型来说,类变量最后使用类操作