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

原文地址:https://www.cnblogs.com/helww/p/9867973.html