• 类和对象的命名空间


    1.类中的代码是在什么时候执行的?

          在实例化之前

    2一个类可不可以没有__init__?  可以

    1  class A:
    2      Country = 'China'
    3      def talk(self):
    4          print('%s is talking'%self.name)
    5  alex = A()
    alex.name="alex"
    alex.talk

    3.在没有__init__的情况下,实例化经历了哪些步骤?

        1,创建一个空间给对象

        2,将这个空间的地址返回

    4,静态属性的增删改 :

     1  class A:
     2      Country = 'China'
     3      def __init__(self,name):
     4          self.name = name
     5      def talk(self):
     6          print('%s is talking'%self.name)
     8  新增静态属性
     9  A.静态属性名 = 'abc'
    10  print(A.静态属性名)
    11  修改静态属性
    12  A.Country = '印度'
    13  print(A.Country)
    14  删除静态属性
    15  del A.Country
    16  print(A.Country)   # 报错
    17 
    18  print(A.__dict__)  # 只能看,不能改也不能删

    5.类的命名空间有什么:

        静态属性

        动态属性(方法)

    6.在实例化的过程中,又开辟了属于对象的一块空

    7. 对象的命名空间和类的命名空间之间的关系 :
             对象和类之间有一个单向的联系,类对象指针
             对象在使用某个名字的时候,如果在自己的空间中没有找到,就要到类的空间中去找

    8.对象可以查看类的静态属性,但是不能修改.并且一旦修改,就不能取到类当中的内容了(除非手动删除这个修改的属性)

    9.所有的静态属性的修改,都应该由类名来完成,而不应该使用对象名来完成

    10.静态属性就是用来描述所有的对象都共享的某一个值

    练习1

     1 """写一个类,能够记录这个类有多少个对象了(每一次实例化都能够被记录下来)"""
     2 第一种
     3  class A:
     4      count = 0
     5      def __init__(self):
     6          A.count += 1
     7  print(A.count)
     8  a = A()
     9  print(A.count)
    10 第二种
    11  class A:
    12      count = 0
    13      def __init__(self):
    14          self.counter()
    15      def counter(self):
    16          A.count+=1
    17  a = A()

    11.如果静态变量是一个不可变数据类型,那么只要对象修改这个数据,就相当于在对象的空间中新建
      如果静态变量是一个可变数据类型,那么对象修改这个容器中的元素,相当于修改类的空间中的元素
        如果静态变量是一个可变数据类型,那么对象直接对这个变量重新赋值,相当于修改对象自己空间中的元素

     1  class B:
     2      l = []
     3      def __init__(self,name):
     4          self.l.append(name)
     5 
     6  alex = B('alex')
     7  baoyuan = B('宝元')
     8  print(B.l)
     9  print(alex.l)
    10  print(baoyuan.l)

    12.大结论:
        只要是静态变量,就用类名去修改,永远修改成功,并且所有的对象都共享这个改变

    13.总结:

         对象的命名空间:类指针对象的所有属性

        类的命名空间:方法和(静态属性字段)

         对象在寻找名字的时候 : 先找对象自己内存空间中的,找不到就去类的命名空间中寻找
         类中的名字是什么时候写入内存的 : 代码从上到下执行的时候就已经写入的.一定是在实例化之前
        静态变量 : 尽量用类名去操作

    组合

    1.什么是组合:

        一个类对象的属性是另外一个类的对象

     1 class Person:
     2     def __init__(self,name,sex,hp,mp,ad):
     3         self.name = name
     4         self.sex = sex
     5         self.hp = hp
     6         self.mp = mp
     7         self.ad = ad
     8     def attack(self,dog):
     9         print('%s攻击了%s'%(self.name,dog.name))
    10         dog.hp -= self.ad
    11 
    12 class Dog:
    13     def __init__(self,name,kind,hp,ad):
    14         self.name = name
    15         self.kind = kind
    16         self.hp = hp
    17         self.ad = ad
    18     def bite(self,person):
    19         print('%s咬了%s'%(self.name,person.name))
    20         person.hp -= self.ad
    21 
    22 alex = Person('alex','不详',10,10,0.1)
    23 hei = Dog('小黑','中华田园犬',999,1.1)
    24 hei.bite(alex)
    25 # 赚钱
    26 # 充值
    27 # 武器装备 增加人的攻击力ad
    28 # 武器类 :
    29 class Weapon:
    30     def __init__(self,name,price,ad):
    31         self.name = name
    32         self.price = price
    33         self.ad = ad
    34     def skill(self,dog):
    35         print('%s被%s攻击了'%(dog.name,self.name))
    36         dog.hp -= self.ad
    37 
    38 sh = Weapon('鞋底子',9.99,66)
    39 # sh.skill(hei)
    40 alex.武器 = sh     # 组合
    41 # 什么是组合 : 一个类对象的属性是另外一个类的对象
    42 alex.武器.skill(hei)  # 组合的应用
    43 sh.ad -= 10
    44 alex.武器.skill(hei)

    练习1

     1 """ 年月日的类
     2     年 月 日
     3 student类
     4      姓名 性别 出生日期
     5 """
     6 
     7 class Birthday:
     8     def __init__(self,year,month,day):
     9         self.year = year
    10         self.month = month
    11         self.day = day
    12 
    13 class Student:
    14     def __init__(self,name,sex,birth_day):
    15         self.name = name
    16         self.sex = sex
    17         self.birthday = birth_day
    18 
    19 birth = Birthday(1996,9,13)
    20 bobo = Student('bobo','male',birth)
    21 # bobo.birthday == birth
    22 birth.year
    23 print(bobo.birthday.year)

    练习2

    """
     环形类
    实例化 接收参数 :大圆半径 小圆半径
    有两个对应的方法:计算环形周长,环形的面积
    """
    from math import pi
    class Circle:           #定义了一个圆形类;提供计算面积(area)和周长(perimeter)的方法
        def __init__(self,radius):
            self.radius = radius    #属性 半径=半径
    
        def area(self):                         #圆的面积
            return pi*self.radius*self.radius   # 3.14*半径*半径
    
        def perimeter(self):                    #圆的周长
            return 2 * pi * self.radius         # 2*3.14*半径
    
    circle =Circle(10) #实例化一个圆
    areal = circle.area() #计算圆面积
    per1=circle.perimeter()#计算圆周长
    print(areal,per1) #打印圆面积和周长
    
    class Ring:  #定义了一个圆环形,提供圆环的面积和周长的方法
        def __init__(self,radius_outside,radius_inside):#radius_outside 外圆的半径 #radius_inside  内圆的半径
            self.outsid_circle=Circle(radius_outside)
            self.inside_circle=Circle(radius_inside)
    
        def area(self):
            return self.outsid_circle.area()-self.inside_circle.area()
    
        def perimeter(self):
            return self.outsid_circle.perimeter()+ self.inside_circle.perimeter()
    
    ring = Ring(10,5) #实例化一个环形
    print(ring.perimeter()) #计算环形的周长
    print(ring.area()) #计算环形的面积
  • 相关阅读:
    mysql权限管理
    centos 6.5安装node.js
    sublime 配置jade高亮显示
    解决国内npm依赖包安装慢的问题
    sublime text3配置node.js开发环境
    datepicker 时间戳转换问题
    关于c++正则表达式的用法
    Android系统binder机制的研究分析
    TCP/IP的分层复用问题
    关于设计模式中外观模式的研究以及关于设计模式中四大原则的理解
  • 原文地址:https://www.cnblogs.com/baoshuang0205/p/9992842.html
Copyright © 2020-2023  润新知