zoukankan      html  css  js  c++  java
  • python 类

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # @Time   : 2017/11/06 22:46
    # @Author : lijunjiang
    # @File   : class.py
    
    """
    类有一般形式
    
    使用class 关键字可以创建一个类,class 后为类的名称并 ()表示的继承默认为object 并以冒号结尾,即:
    class class_name(object):
        '类的帮助信息'  #类的文档字符串
        class_suite     #类体
    
    object 默认是所有类的父类,不写默认继承object
    
    """
    # 创建一个类
    class myclass(object):
        '''this is a class about myclass'''
        myclass_name = 'myclass'
        myclass_info = 'is a class'
        def myclass_func(self):
            print('hello, is a my first class!')
    
    """
    说明:
    myclass_name和myclass_info 是类myclass的两个变量,它们的值将在这个类所有的实例间共享,可能使用
    实例名.myclass_name 或 实例名.myclass_info 访问这两个变量
    
    myclass_func 是类的方法,该方法可以在这个类的所有实例中以 实例名.myclass_func()  的方式调用
    """
    
    # 类的实例化
    a = myclass()
    print(type(a))
    
    # 执行结果:<class '__main__.myclass'>
    
    # 访问类的变量
    print(a.myclass_name)
    print(a.myclass_info)
    
    # 执行结果:
    # myclass
    # is a class
    
    # 调用类的方法
    
    a.myclass_func()
    
    # 执行结果:hello, is a my first class!
    
    # 在实例中改变类变量的值,实例.类变量名 = '要赋的值'
    print(a.myclass_name)
    a.myclass_name = 'set myclass_name'
    print(a.myclass_name)
    
    # 执行结果:
    # myclass
    # set myclass_name
    
    """
    类的构造器
    
    构造函数:__init__
    作用:在生成对象时调用,在创建一个类时,有一些在实例化时必须绑定某些属性时,可以定义一个__init__方法
    将其强制填写进去。
    
    例如声明一个ren的类,在实例化时必须填入name 和sex 时
    """
    # 声明一个ren的类,具有name sex 属性
    class ren():    # 不指定其父类,默认继承object类
        def __init__(self, name, sex):
            self.name = name
            self.sex = sex
    
    # # 创建一个类为ren的man实例,不指定name sex 属性时
    # man = ren()
    # 执行结果:报错-缺少必要的参数
    # Traceback (most recent call last):
    #   File "D:/Python/class/class1.py", line 80, in <module>
    #     man = ren()
    # TypeError: __init__() takes exactly 3 arguments (1 given)
    
    # 创建一个类为ren的man实例,同时指定name sex
    man = ren("man", "m")
    print(man.name)
    print(man.sex)
    
    # 执行结果:
    # man
    # m
    
    """
    说明:
    类的方法与普通函数只有一个特别的区别-它们必须有一个额外的第一个参数名称,self
    参数self 代表类的实例,而非类
    在调用时,self参数不用传入,在上例中Python会自动把ren实例化的man传递给第一个参数,即self
    
    在类实例化时,如果在构造函数__init__中声明了类的某些必须属性,则在实例化这个类时,必须传入对应的参数,否则会报错
    """
    
    """
    类的继承
    class A()
    class B(A)
    class C(A,B)
    """
    
    # 声明一个peson类,具有属性name 和sex ,方法 info()
    class peson(object):
        # name = 'peson'
        # sex = 'F or M'
        def __init__(self, name='peson', sex='F or M'):
            self.name = name
            self.sex = sex
        def info(self):
            print('hello {0},your is a {1}'.format(self.name, self.sex))
    
    # 声明一个man类,继承peson类,具有方法
    class man(peson):
        def man_func(self):
            print('My name is {0}, I am a {1}'.format(self.name, self.sex))
    
    
    # 初始化一个peson实例
    a = peson()
    print(a.name)
    print(a.sex)
    a.info()
    # 执行结果:
    # peson
    # F or M
    # hello peson,your is a F or M
    
    #初始化一个man实例
    m = man()
    print(m.name)
    print(m.sex)
    m.info()
    m.man_func()
    print(dir(m))
    # 执行结果:
    # peson
    # F or M
    # hello peson,your is a F or M
    # My name is peson, I am a F or M
    # ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__',
    # '__new__', ' '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
    #  'info', 'man_func', 'name', 'sex']
    """
    由上面例子可以看出:
    man 类 继承了 peson 类,拥有poson类的属性name sex 和方法 info(),同时也具有自已的方法 man_func()
    """
    print('=====================类的重写==========================')
    
    class peson_new(object):
        name = 'peson'
        sex = 'F or M'
        def __init__(self):
            print('hello {0},your is a {1}'.format(self.name, self.sex))
        def info(self):
            print('This is a function info of peson class')
    
    class man_1(peson_new):
        name = 'man'
        sex = 'M'
        def info(self):
            print('This is new function info of man_1 class')
    
    print('peson 类的属性 和 方法')
    p = peson_new()
    print(p.name)
    print(p.sex)
    p.info()
    print('man_1 类的属性和方法')
    m2 = man_1()
    print(m2.name)
    print(m2.sex)
    m2.info()
    # 执行结果:
    # =====================类的重写==========================
    # peson 类的属性 和 方法
    # hello peson,your is a F or M
    # peson
    # F or M
    # This is a function info of peson class
    # man_1 类的属性和方法
    # hello man,your is a M
    # man
    # M
    # This is new function info of man_1 class
    """
    在子类中,使用与父类中相同变量或方法名,可以重新定义父类中的属性和方法
    """
    
    print("=====================类的多继承========================")
    # 声明一个girl类,同时继 peson 类和 man 类
    class girl(man):
        def girl_func(self):
            print('I like myself ,name is {0}'.format(self.name))
    
    # 声明一个man 实例和一个 gril实例
    
    m1 = man('Dalang Wu',"M")
    g = girl('Jinglian Pan', 'F')
    
    # 打印它们的属性
    print("man实例属性")
    print(m1.name)
    print(m1.sex)
    print('man实例方法')
    m1.info()
    m1.man_func()
    
    print('gril实例的属性')
    print(g.name)
    print(g.sex)
    print('gril实例的方法')
    g.info()
    g.man_func()
    g.girl_func()
    
    
    # 执行结果:
    # =====================类的继承========================
    # man实例属性
    # Dalang Wu
    # M
    # man实例方法
    # hello Dalang Wu,your is a M
    # My name is Dalang Wu, I am a M
    # gril实例的属性
    # Jinglian Pan
    # F
    # gril实例的方法
    # hello Jinglian Pan,your is a F
    # My name is Jinglian Pan, I am a F
    # I like myself ,name is Jinglian Pan
    #
    # Process finished with exit code 0
    
    """
    从上例可以看出:
    当man类继承了peson类后,man具有了peson类的属性和方法
    当girl类同时继承了peson类和man类时,同时具备这两个类的属性和方法
    这就是类的多继承
    """
    
    
  • 相关阅读:
    IntelliJ IDEA 2017 注册方法
    WindowsAll下安装与破解IntelliJ IDEA2017
    JPA的一对多映射(双向)关联
    JPA 单向一对多关联关系
    JPA 映射单向多对一的关联关系
    关于数据库主键和外键
    JPA(API)
    X509 文件扩展名
    linux设置支持中文
    wp8安装SSL证书
  • 原文地址:https://www.cnblogs.com/lijunjiang2015/p/7796021.html
Copyright © 2011-2022 走看看