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