目录
1.创建类
1.1 什么是类
在Python中,首字母大写的名称是类。
1.1.1 方法 _ _init_ _()
_ _init_ _() 是一个特殊的方法,每当根据类创建新实例时,Python会自动运行它,在这个方法名称中,开头和末尾都有两个下划线,旨在避免Python默认方法与普通方法发生名称冲突
_ _init_ _() 中的三个形参self、name、age,形参self必不可少,还必须位于其他参数前面。在Python调用 _ _init_ _() 方法来创建Dog实例时,将自动传入实参 self。每个与类 相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。同时,以self为前缀的变量都可供类中的所有方法使用,我们可以通过类的任何实例来访问这些变量。
#创建 Dog()类
class Dog():
# 每个与类 相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,
# 让实例能够访问类中的属性和方法。
# 以self为前缀的变量都可供类中的所有方法使用
def __init__(self,name,age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + 'is now sitting.')
def roll_row(self):
print(self.name.title() + 'rolled over')
1.2 根据类创建实例
my_dog = Dog('willie',6) # 实例
print("My dog is " + my_dog.name.title()) # 用句点表示法访问实例的属性
my_dog.sit() # 用句点表示法来调用 Dog 类中定义的任何方法
you_dog = Dog('sdfdf',10) # 可根据需求创建多个实例
you_dog.sit()
you_dog.roll_row()
输出: My dog is Willie
Willieis now sitting.
Sdfdfis now sitting.
Sdfdfrolled over
2.使用类和实例
2.1 给属性指定默认值
类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。在有些情况下,如设置默认值时,在方法 _ _init_ _() 内指定这种初始值是可行的;如果你对某个属性这样做了,就无需包含为它提供初始值的形参。
class Car():
def __init__(self):
self.name = 'hongqi'
self.id = '10001'
self.born = '2014'
def my_print(self):
full_name = str(self.born) + '\t' + self.name.title() + '\t' +self.id
return full_name
my_car = Car()
print(my_car.my_print())
my_car.name = 'xueying'
print(my_car.my_print())
2.2 修改属性的值
对于公有属性直接修改/访问 或间接修改/访问都可以
对于私有属性只能间接修改/访问
# 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,
# 在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
class Car():
def __init__(self,model,name,id):
self.model = model
self.__name = name # 私有变量
self.__id = id
def my_print(self):
print(self.model,self.__name,self.__id)
def get_model(self):
return self.model
def up_model(self,model):
self.model = model
def get_id(self):
return self.__id
def up_id(self,id):
self.__id = id
my_car = Car('fds','fsd','23934')
my_car.my_print()
my_car.model = 'fweg' # 外部可以直接修改公有变量属性值
my_car.my_print()
my_car.up_model('koiu') # 外部可以通过方法间接修改公有变量属性值
print(my_car.model,my_car.get_model()) # 外部可以直接或间接访问公有变量属性值
my_car.id = '19293' # 外部直接修改私有变量属性值,编译器不报错是因为编译器将它和类中的属性看成不同的变量
my_car.my_print() # 输出类中属性 id 的值没有发生改变
print(my_car.id,my_car.get_id()) # 外部不能直接修改私有变量属性值
my_car.up_id('9837249') # 可以通过间接的方法改变属性的值
my_car.my_print()
输出: fds fsd 23934
fweg fsd 23934
koiu koiu
koiu fsd 23934
19293 23934
koiu fsd 9837249
3.继承
一个类继承另一个类时,它将自动获得另一个类的所有属性和方法,原有的类称为父类,而新的类称为子类,子类继承父类的所有属性和方法,同时还定义自己的属性和方法。
创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时必须在括号里指定父类的名字。
class Animal(object) :
def run(self):
print("1Animal is run...")
def eat(self):
print("2Animal is eating...")
class Dog(Animal): # Animal 是 Dog 的父类,Dog 是 animal 的子类
def run(self):
print("3dog is run...")
# 当子类和父类都存在相同的run()方法时,子类的run()覆盖了父类的run(),
# 在代码运行的时候,总是会先调用子类的run(),如果子类没有run(),再调用父类。
class Cat(Animal):
def run(self):
print("4cat is run...")
def run_eat(Animal):
Animal.eat()
Animal.run()
animal = Animal()
run_eat(animal)
run_eat(Dog())
run_eat(Cat())
输出: 2Animal is eating...
1Animal is run...
2Animal is eating...
3dog is run...
2Animal is eating...
4cat is run...
继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
super()函数帮助Python将父类和子类关联起来
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odomrter_reading = 0
def get_descriptive_name(self):
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odometer(self):
print("This car has" + str(self.odomrter_reading) + "miles on it")
class Ele_car(Car):
def __init__(self,make,model,year):
super().__init__(make,model,year)
my_car = Ele_car('hongqi','modes',3241)
print(my_car.get_descriptive_name())
4.导入类
导入类类似于导入函数
from module_name import module_class // 导入单个类
from module_name import module_class1,module_class2,module_class3 // 导入多个类
from module_name import * // 导入所有类
import module_name // 导入整个模块
5. 类编码风格
类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不是用下划线
实例名和模块名都采用小写格式,并在单词之间加上下划线,对于每个类,都应紧跟在类定义后面包含一个文档字符串,用于简要描述类的功能。
需要同时导入标准库中的模块和自己编写的模块时,先编写导入标准模块的 import 语句,在添加一个空行,编写导入自己编写的 import 语句