当前位置: 移动技术网 > IT编程>脚本编程>Python > day23 01 类的命名空间

day23 01 类的命名空间

2019年05月15日  | 移动技术网IT编程  | 我要评论

假戏真做悄悄爱上你,萨拉斯小径在哪,魔光迷影

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所以:

注意:对于不可变的数据类型来说,类变量最后使用类操作

 

 

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网