zoukankan      html  css  js  c++  java
  • 18、面向对象(静态属性、类方法、静态方法)


    18.1、说明:

    1、什么是类和对象:

    数据属性和方法属性的结合体就一个对象;

    从一组对象中提取相似的部分就是类,类是对象都具有的数据属性和方法属性的结合体;


    2、通常情况下,在类中定义的所有函数(注意了,这里说的就是所有,跟self啥的没关系,self也只是一个再普通不过的参数而已)都是对象的绑定方法,

    对象在调用绑定方法时会自动将自己作为参数传递给方法的第一个参数。除此之外还有两种常见的方法:静态方法和类方法,二者是为类量身定制的,但

    是实例非要使用,也不会报错,只不过实例去调用的时候容易让人混淆,不知道你要干啥,且实例在使用时丧失了自动传值的机制;


    18.2、示例:

    class Room:

    tag=1

    def __init__(self,name,owner,width,length,heigh):

    self.name=name

    self.owner=owner

    self.width=width

    self.length=length

    self.heigh=heigh


    def test(self):

    print('from test',self.name)

    # 普通方法


    @property

    def cal_area(self):

    return self.width * self.length

    # 静态属性


    @classmethod

    def tell_info(cls,x):

    print(cls)

    print('--》',cls.tag,x)

    # 类方法


    @staticmethod

    def wash_body(a, b, c):

    print('%s %s %s正在洗澡' % (a, b, c))

    # 静态方法



    r1=Room('房间1','lc1',20,20,10)

    r1.test()

    print(r1.cal_area)

    print(r1.name)

    # from test 房间1

    # 400

    # 房间1

    # 静态属性修饰的函数绑定的是对象(函数内能使用类变量和对象变量),对象可以通过调用数

    # 据属性的方式调用函数属性,可以有效的隐藏函数属性下的代码逻辑;


    Room.tell_info(10)

    # <class '__main__.Room'>

    # --》 1 10

    # 类方法修饰的函数绑定的是类(函数内不能使用对象变量),在默认的情况下函数默认是绑定

    # 对象的,类方法是专门为类所使用的;

    # r1.tell_info(5)

    # <class '__main__.Room'>

    # --》 1 5

    # 对象也可以使用,但通常类方法都是给类用的;


    Room.wash_body('lc1','lc2','lc3')

    # lc1 lc2 lc3正在洗澡

    # 静态方法修饰的函数既不绑定类也不绑定对象(函数内不能使用类变量和对象变量),是类的

    # 工具包;

    # r1.wash_body('lc1','lc2','lc3')

    # lc1 lc2 lc3正在洗澡

    # 对象也可以使用,但通常静态方法都是给类用的;


    18.3、补充、组合:

    1、组合是在一个类中以另外一个类的对象作为数据属性,称为类的组合,用于相似性小的类之间;


    2、作用:提高的软件的重用性;


    3、组合与继承的区别:

    (1)继承:建立了派生类与基类之间的关系,它是一种“是”的关系,比如白马是马,人是动物,当类之间有很多相同的功能,

    提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生也是人。

    (2)组合:建立了类与组合类之间的关系,它是一种“有”的关系,比如教授有生日,教授有课程,教授有学生。


    4、示例:

    class School:

    def __init__(self,name,addr):

    self.name=name

    self.addr=addr


    def zhao_sheng(self):

    print('%s 正在招生' %self.name)


    class Course:

    def __init__(self,name,price,period,school):

    self.name=name

    self.price=price

    self.period=period

    self.school=school

    # 学校里有课程


    s1=School('oldboy','北京')

    s2=School('oldboy','南京')

    s3=School('oldboy','东京')


    # c1=Course('linux',10,'1h','oldboy 北京')

    # c1=Course('linux',10,'1h',s1)


    msg='''

    1 老男孩 北京校区

    2 老男孩 南京校区

    3 老男孩 东京校区

    '''

    while True:

    print(msg)

    menu={

    '1':s1,

    '2':s2,

    '3':s3

    }

    choice=input('选择学校>>: ')

    school_obj=menu[choice]

    # print(menu['1'])

    # <__main__.School object at 0x0000027DAD2435C0>

    name=input('课程名>>: ')

    price=input('课程费用>>: ')

    period=input('课程周期>>: ')

    new_course=Course(name,price,period,school_obj)

    print('课程【%s】属于【%s】学校' %(new_course.name,new_course.school.name))

















  • 相关阅读:
    Java实现 计蒜客 拯救行动
    Java实现 计蒜客 拯救行动
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 173 二叉搜索树迭代器
    Java实现 LeetCode 173 二叉搜索树迭代器
    Visual Studio的SDK配置
    怎样使用CMenu类
    mfc menu用法一
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/12317228.html
Copyright © 2011-2022 走看看