zoukankan      html  css  js  c++  java
  • 24 【python入门指南】class

    一、类

    1.1,构造函数,析构函数

    #!/bin/python
    
    class dog():
        def __init__(self, age, name):
            self.age = age 
            self.name = name
        def print_self(self):
            print('Dog name is %s' %(self.name))
            print('Dog age is %d' %(self.age))
    
    a = dog(10, 'alaski')
    a.print_self()

    输出结果:

    Dog name is alaski
    Dog age is 10

    析构函数

    #!/bin/python
    
    class dog():
        def __init__(self, age, name):
            self.age = age
            self.name = name
        def print_self(self):
            print('Dog name is %s' %(self.name))
            print('Dog age is %d' %(self.age))
        def __del__(self):
            print("delete dog object %s" %(self.name))
    
    
    a = dog(10, 'alaski')
    a.print_self()

    输出结果:

    Dog name is alaski
    Dog age is 10
    delete dog object alaski

    以上介绍了构造函数:__init__,析构函数:__del__。

    1.2,变量

    公有变量,私有变量

    首先介绍一个背景,python对于类有个默认预定:

    vvv:正常以a-z开头的变量,或者方法,python认定其为公有变量或者函数;

    _vvv:(单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入)这个是从参考资料中查到的,我没有验证过【参考资料1】;

    __vvv:如果以两个下划线开头,后面再接a-z的话,python认定其为私有变量或者函数;

    __vv__:如果以两个下划线开头,并且两个下划线截止的格式,python认定其为保留格式,python用于内置函数或者扩展用法,应用程序杜绝这种写法,仅适用于python官方开发人员使用;

    公有,私有变量

    #!/bin/python
    
    class dog():
    
        def __init__(self, age, name):
            self.age = age
            self.name = name
            self.__type = 'dog'
    
        def print_self(self):
            print('Dog name is %s' %(self.name))
            print('Dog age is %d' %(self.age))
            print('Animal type is %s' %(self.__type))
    
    
    a = dog(10, 'alaski')
    a.print_self()
    print(a.name)
    #AttributeError: 'dog' object has no attribute '__type'
    print(a.__type)

    输出结果:

    Dog name is alaski
    Dog age is 10
    Animal type is dog
    alask

    1.3,函数

    公有函数,私有函数

    #!/bin/python
    
    class dog():
    
        def __init__(self, age, name):
            self.age = age
            self.name = name
            self.__type = 'dog'
    
        def print_self(self):
            print('Dog name is %s' %(self.name))
            print('Dog age is %d' %(self.age))
            print('Animal type is %s' %(self.__type))
    
        def smile(self):
            print('Dog(%s) is smiling' %(self.name))
            self.__set_smiling()
    
        def __set_smiling(self):
            self.__attitude = 'smile'
    
    
    a = dog(10, 'alaski')
    a.smile()
    
    #AttributeError: 'dog' object has no attribute '__set_smiling'
    a.__set_smiling()

    输出结果:

    Dog(alaski) is smiling

    可以看到,dog类中的私有函数为__set_smiling,它可以被类中的函数调用,但是无法在类外使用(使用会报错)。

    1.4,static变量和函数

    目前我查到的资料中显示,python并不天然支持static变量和static函数。

    二,继承

    2.1,继承

    #!/bin/python
    
    class person:
        def __init__(self):
            print("person is intialized")
        def say(self):
            print("person is saying")
    
    class driver(person):
        def __init__(self):
            super().__init__()
            print("i am a driver")
        def say(self):
            print("driver is saying")
    
    a = driver()
    a.say()

    输出结果:

    person is intialized
    i am a driver
    driver is saying

    driver继承了person类,并在初始化的时候调用了父类的初始化构造函数。

    2.2,父类的私有类是否能被继承?

    如果父类的函数是私有函数,也就是以__开头的,是不允许子类访问的。

    代码:

    #!/bin/python
    
    class person:
        def __init__(self):
            print("person is intialized")
        def say(self):
            print("person is saying")
        def __say_to_self(self):
            print('i am saying sth to myself')
    
    class driver(person):
        def __init__(self):
            super().__init__()
            super().__say_to_self()
            print("i am a driver")
    
        def say(self):
            print("driver is saying")
    
    a = driver()
    a.say()

    报错:

    person is intialized
    Traceback (most recent call last):
      File "class2.py", line 20, in <module>
        a = driver()
      File "class2.py", line 14, in __init__
        super().__say_to_self()
    AttributeError: 'super' object has no attribute '_driver__say_to_self'

    2.3,设定某些函数可以被自身及其子类所访问

    #!/bin/python
    
    class person:
        def __init__(self):
            print("person is intialized")
        def say(self):
            print("person is saying")
        def __say_to_self(self):
            print('i am saying sth to myself')
        def _say_to_other(self):
            print('i am saying sth to other, and the saying is listened by all of them')
    
    
    class driver(person):
        def __init__(self):
            super().__init__()
            super()._say_to_other()
            print("i am a driver")
    
        def say(self):
            print("driver is saying")
    
    a = driver()
    a._say_to_other()

    输出:

    person is intialized
    i am saying sth to other, and the saying is listened by all of them
    i am a driver
    i am saying sth to other, and the saying is listened by all of them

    设定的_say_to_other是可以被子类所访问的,但是它和c++中的protected不一样。以单个下划线开头的函数,和公开方法是一样的,既可以被自身和子类访问,又能在类外所访问。

    三、导入类

    3.1,导入单个类

    文件: car.py
    #!/bin/python
    
    
    class Car:
        year = 0             
        brand = ''
        series = ''          
    
        def __init__(self, brand, series, year):
            self.brand = brand        
            self.series = series      
            self.year = year
    
        def get_car_desc(self):   
            desc = ''
            desc += ("car info: [year:%d] [brand:%s] [series:%s]" % (self.year, self.brand, self.series)) 
            return desc
    
    文件: my_car.py
    #!/bin/python
    from car import Car 
    
    c = Car('tesla', 'Model X', 2016)
    d = c.get_car_desc()
    print(d)

    可以在my_car.py中引入类Car,引用时候使用from car import Car

    from [A] import [B]

    A要和文件名前缀保持一致,B要和类名保持一致,并且要区分大小写。

    3.2,在一个模块中存储多个类

    文件:car.py
    #!/bin/python
    
    
    class Car:
        year = 0
        brand = ''
        series = ''
    
        def __init__(self, brand, series, year):
            self.brand = brand
            self.series = series
            self.year = year
    
        def get_car_desc(self):
            desc = ''
            desc += ("car info: [year:%d] [brand:%s] [series:%s]" % (self.year, self.brand, self.series))
            return desc
    
    
    class ElectricCar(Car):
        def __init__(self, brand, series, year):
            super().__init__(brand, series, year)
    
        def get_range():
            return "100 miles"
    
    文件:my_car.py
    #!/bin/python
    from car import Car 
    from car import ElectricCar
    
    c = Car('bmw', 'X3', 2016)
    d = c.get_car_desc()
    print(d)
    
    tesla = ElectricCar('tesla', 'Model S', 2017) 
    d = tesla.get_car_desc()
    print(d)

    3.3,从一个模块中导入多个类

    和3.2公用一个例子

    from car import Car, ElectricCar可以存储和导入多个类

    3.4,导入整个模块

    #!/bin/python
    
    import car 
    
    c = car.Car('Nissan', 'Sylphy', 2012)
    print(c.get_car_desc())

    car.py仍然使用之前的文件,但是my_car.py需要修改下。

    导入整个模块使用import car,但是初始化实例时候需要使用全称,不能简化:a = car.Car()这种方式。

    参考资料:

    1,https://www.cnblogs.com/semon-code/p/8242062.html

  • 相关阅读:
    crontab定时任务写法记录
    Django与Vue语法冲突问题完美解决方法
    Django下MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL解惑
    解决python2.x用urllib2证书验证错误, _create_unverified_context
    django 异步任务实现及Celery beat实现定时/轮询任务
    用Python写WebService接口并且调用
    django(权限、认证)系统——第三方组件实现Object级别权限控制
    django(权限、认证)系统—— 基于Authentication backends定制
    django(权限、认证)系统—— Permissions和Group
    [jmeter]linux下自动测试环境+持续集成ant+jmeter+Apache(httpd)环境搭建与使用
  • 原文地址:https://www.cnblogs.com/helww/p/9867973.html
Copyright © 2011-2022 走看看