欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

day23 01 类的命名空间

程序员文章站 2022-07-09 21:36:21
day23 01 类的命名空间 一、初识面向对象复习 定义类: class 函数:方法 动态属性 变量:类属性 静态属性 过程: (1)_init_方法:初始化:def _init_(self,参数) python帮我们创建了一个对象self 每当我们调用类的时候就会自动触发这个方法 在_init_ ......

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

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