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 "", line 31, in
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所以:
注意:对于不可变的数据类型来说,类变量最后使用类操作
希望与广大网友互动??
点此进行留言吧!