• python之路 -- 面向对象基础


    类和对象的相关知识

    1.类的声明

    '''
    class 类名:
        类体
    '''
    #创建一个简单的people类
    class People:            #类名的首字母一般大写
        people = "chinese"   #类的静态属性
        def walk(self):      #类的方法的定义
            print("people can walk.")
    
    print(People.people)    #查看People类的静态属性people
    print(People.walk)      #引用人的走路方法,注意,这里不是在调用walk方法
    print(People.walk())  # 会报错

    # chinese
    # <function People.walk at 0x000001F0FC924D08>

    2.实例化

    实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征

    实例化的过程就是类——>对象的过程

     1 class People:
     2     people = "chinese"      #类的静态属性
     3     def __init__(self,name,age,sex):    #必须有一个self参数,且在第一个位置
     4         self.name = name
     5         self.age = age
     6         self.sex = sex
     7 
     8     def walk(self):         #类的方法的定义
     9         print('%s正在走路。'%self.name)
    10 
    11 yl = People('yangl',18,"")     #这就是一个实例化的过程,得到一个yl的对象  类名()就等于在执行Person.__init__()
    12                                 #注意:实例化是传入的参数是__init__方法中的参数,且必须传
    13 print(yl.name)              #查看此对象的属性
    14 #>>>yangl
    15 yl.walk()               #调用此对象中的方法,<==>People.walk(yl),得到相同的结果
    16                         #调用方法,对象名.方法名()
    17 #>>>yangl正在走路。

    3.整理的过程如下:

    # 1.定义类
    # 2.写__init__方法,此前可以定义静态属性
    # 3.定义方法,方法都必须有一个self参数
    # 4.实例化
    #     对象=类(参数是__init__方法中的)
    #     实例和对象没有区别
    # 5.对象查看属性
    #   调用对象的属性 对象.属性名
    #   调用对象方法  对象.方法名(参数)《==》类名.方法名(对象名,参数)

    4.类属性的补充

    一:我们定义的类的属性到底存到哪里了?有两种方式查看
    dir(类名):查出的是一个名字列表
    类名.__dict__:查出的是一个字典,key为属性名,value为属性值
    
    二:特殊的类属性
    类名.__name__# 类的名字(字符串)
    类名.__doc__# 类的文档字符串
    类名.__base__# 类的第一个父类
    类名.__bases__# 类所有父类构成的元组
    类名.__dict__# 类的字典属性
    类名.__module__# 类定义所在的模块
    类名.__class__# 实例对应的类(仅新式类中)

    5.类的小练习

     1 #在终端输出如下信息,用面向对象的方式
     2 #小明,20岁,男,上山去砍柴
     3 #小明,20岁,男,开车去东北
     4 #小明,20岁,男,最爱happy
     5 #老李,60岁,男,上山去砍柴
     6 #老李,60岁,男,开车去东北
     7 #老李,60岁,男,最爱happy
     8 
     9 class People:
    10     def __init__(self,name,age,sex):
    11         self.name = name
    12         self.age = age
    13         self.sex = sex
    14 
    15     def shangshan(self):
    16         print("%s,%s岁,%s,上山去砍柴"%(self.name,self.age,self.sex))
    17 
    18     def drive(self):
    19         print("%s,%s岁,%s,开车去东北" % (self.name, self.age, self.sex))
    20 
    21     def hobby(self):
    22         print("%s,%s岁,%s,最爱happy" % (self.name, self.age, self.sex))
    23 
    24 xiaoming = People('小明',20,'')
    25 xiaoming.shangshan()
    26 xiaoming.drive()
    27 xiaoming.hobby()
    28 laoli = People('老李',60,'')
    29 laoli.shangshan()
    30 laoli.drive()
    31 laoli.hobby()
    练习一
     1 #一个圆circle    属性:半径,两个方法:求周长和面积
     2 
     3 from math import pi    #导入π
     4 class Circle:
     5     def __init__(self,r):
     6         self.r = r
     7 
     8 #定义一个计算圆的周长的方法
     9     def zhouchang(self):        
    10         return 2*pi*self.r
    11 
    12 #定义一个计算圆的面积的方法
    13     def area(self):
    14         print(pi*(self.r**2))
    15 
    16 yuan1 = Circle(5)        #实例化一个圆,传入半径为5
    17 print(yuan1.zhouchang())        #计算圆的周长
    18 yuan1.area()            #计算圆面积
    练习二
     1 #人狗大战游戏
     2 class People:
     3     def __init__(self,name,blood,aggr,sex):
     4         self.name = name
     5         self.blood = blood
     6         self.aggr = aggr
     7         self.sex = sex
     8 
     9     def attack(self,dog):
    10         dog.blood -= self.aggr
    11         if dog.blood <= 0:
    12             print("%s已经被%s打败,%s扑街~~"%(dog.name,self.name,dog.name))
    13         else:
    14             print("%s剩余的血量为:%s"%(dog.name,dog.blood))
    15 
    16 class Dog:
    17     def __init__(self,name,blood,aggr,sex):
    18         self.name = name
    19         self.blood = blood
    20         self.aggr = aggr
    21         self.sex = sex
    22 
    23     def bite(self,people):
    24         people.blood -= self.aggr
    25         if people.blood <= 0:
    26             print("%s已经被%s打败,%s扑街~~"%(people.name,self.name,people.name))
    27         else:
    28             print("%s剩余的血量为:%s"%(people.name,people.blood))
    29 
    30 people = People("alex",100,10,"man")
    31 dog = Dog("金老板",200,20,"dog")
    32 
    33 #人攻击狗的操作
    34 people.attack(dog)
    35 #狗咬人的操作
    36 dog.bite(people)
    37 people.attack(dog)
    38 dog.bite(people)
    练习三

    6.面向对象小结——定义及调用的固定模式

     1 class 类名:
     2     def __init__(self,参数1,参数2):
     3         self.对象的属性1 = 参数1
     4         self.对象的属性2 = 参数2
     5 
     6     def 方法名(self):pass
     7 
     8     def 方法名2(self):pass
     9 
    10 对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
    11                   #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
    12                   #括号里传参数,参数不需要传self,其他与init中的形参一一对应
    13                   #结果返回一个对象
    14 对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
    15 对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

    类命名空间与对象、实例的命名空间

    创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

    而类有两种属性:静态属性和动态属性

      静态属性就是直接在类中定义的变量

      动态属性就是定义在类中的方法

    其中类的数据属性是共享给所有对象的

    >>>id(egg.role)
    4341594072
    >>>id(Person.role)
    4341594072

    而类的动态属性是绑定到所有对象的(不共享)

    >>>egg.attack
    <bound method Person.attack of <__main__.Person object at 0x101285860>>
    >>>Person.attack
    <function Person.attack at 0x10127abf8> 

    创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性

    在obj.name会先从obj对象自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常


    面向对象的组合用法

    软件重用的重要方式除了继承之外还有另外一种方式,即:组合

    组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

     1 class Teacher:    #创建一个Teacher类
     2     def __init__(self,name,age,classes):
     3         self.name = name
     4         self.age = age
     5         self.classes = classes
     6 
     7 class Classes:    #创建一个Classees类
     8     def __init__(self,name,stu_num,price):
     9         self.name = name
    10         self.stu_num = stu_num
    11         self.price = price
    12 
    13 classes1 = Classes("python全栈",30,19980)
    14 teacher1 = Teacher("yl",18,classes1)    
    15 #teacher的classes属性调用了对象classes1
    16 print(teacher1.classes.name)
    17 
    18 #运行结果:python全栈

      圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。

    这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用。

     1 from math import pi
     2 class Circle:
     3     def __init__(self,r):
     4         self.r = r
     5 
     6     def zhouchang(self):
     7         return 2*pi*self.r
     8 
     9     def area(self):
    10         return pi*(self.r**2)
    11 
    12 class Yuanhuan:
    13     def __init__(self,c1,c2):
    14         self.c1 = c1
    15         self.c2 = c2
    16 
    17     def huanzc(self):
    18         print(self.c1.zhouchang() + self.c2.zhouchang())
    19 
    20     def huanmj(self):
    21         return abs(self.c1.area() - self.c2.area())
    22 
    23 C1 = Circle(10)        #实例化一个半径为10的圆
    24 C2 = Circle(5)        #实例化一个半径为5的圆
    25 huan1 = Yuanhuan(C1,C2)    #实例化一个圆环
    26 print(huan1.huanmj())    #输出圆环的面积
    27 huan1.huanzc()        #输出圆环的周长
  • 相关阅读:
    UILabel 设置字体间的距离 和 行与行间的距离
    IB_DESIGNABLE 和 IBInspectable 的使用
    干货博客
    GitHub克隆速度太慢解决方案
    实时(RTC)时钟,系统时钟和CPU时钟
    折腾了好久的vscode配置c/c++语言环境(Windows环境下)
    c语言中的malloc函数
    记录一下关于在工具类中更新UI使用RunOnUiThread犯的极其愚蠢的错误
    记录关于Android多线程的一个坑
    Android中限制输入框最大输入长度
  • 原文地址:https://www.cnblogs.com/aberwang/p/9321486.html
Copyright © 2020-2023  润新知