一、类
1、创建类
class 类名:
statements
class 定义类的关键字
statements 类的主体语句块
2、__init__() 方法
类中的函数称作方法,__init__()
是一个特殊的方法,每当我们实例化一个对象时,这个方法都会自动执行。方法名的开头为两个下划线,结尾同样为两个下划线,这种命名的习惯主要是为了区分 Python 默认的方法名和我们自己定义的方法名。
参数规则:
__init__(self, 参数1, 参数2, ... , 参数n):
self :必备参数,表示自身对象,用于实例化对象时使用,参数自动传入
参数1,参数2,...,参数n :表示对象实例化属性特征,可多个,也可0个
每个方法都可以包含一个会自动传入的参数 self,这个参数是实例化对象的引用。这样方法便可以访问对象的属性和方法。在实例化对象时,由于 self 参数自动传入的,所以只需要传入其他参数的值。
如下,定义了一个Bird类,并定义其属性、方法等
#创建类Bird
class Bird:
#对象初始化语句
def __init__(self, n, c, s):
self.name = n
self.color = c
self.size = s
#定义方法get_description,参数为self,自动传入
def get_description(self):
description = f'{self.name} {self.color} {self.size} '
print(description)
二、对象
类是用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。类是抽象的,对象是对类进行具象的实例化。
1、实例化对象
如实例化定义的Bird类,如下:
#实例化对象my_bird,为my_bird赋予属性'鹦鹉', '绿色', '中等大小'
my_bird = Bird('鹦鹉', '绿色', '中等大小')
2、访问属性
语法:对象名.属性名
#访问my_bird对象的属性name和color
print(f"My bird's name is {my_bird.name}")
print(f"My bird's color is {my_bird.color}")
输出:
My bird's name is 鹦鹉
My bird's color is 绿色
3、访问方法
语法:对象名.方法名
#访问my_bird对象的get_description()方法
my_bird.get_description()
输出:
鹦鹉 绿色 中等大小
4、实例化多个对象
my_bird = Bird('鹦鹉', '绿色', '中等大小')
your_bird = Bird('麻雀', '灰色', '小小一只')
5、为属性设置默认值
class Bird:
def __init__(self, n, c, s):
self.name = n
self.color = c
self.size = s
#设置属性age的默认值为1
self.age = 1
def get_description(self):
description = f'{self.name} {self.color} {self.size} '
print(description)
#定义获取属性age的方法
def get_age(self):
print(f"This bird is {self.age} ")
my_bird = Bird('鹦鹉', '绿色', '中等大小')
my_bird.get_age()
输出:
This bird is 1
在上述代码中添加了一个属性 age,并且将默认值设置成 1。并且添加一个方法 get_age()
用于获取属性 age 的值。
6、直接改变属性值
语法:对象名.属性名=值
class Bird:
def __init__(self, n, c, s):
self.name = n
self.color = c
self.size = s
self.age = 1
def get_description(self):
description = f'{self.name} {self.color} {self.size} '
print(description)
def get_age(self):
print(f"This bird is {self.age} ")
my_bird = Bird('鹦鹉', '绿色', '中等大小')
my_bird.age = 3
my_bird.get_age()
输出:
This bird is 3
7、通过方法改变属性值
class Bird:
def __init__(self, n, c, s):
self.name = n
self.color = c
self.size = s
self.age = 1
def get_description(self):
description = f'{self.name} {self.color} {self.size} '
print(description)
def get_age(self):
print(f"This bird is {self.age} ")
def update_age(self, a):
self.age = a
my_bird = Bird('鹦鹉', '绿色', '中等大小')
my_bird.update_age(5)
my_bird.get_age()
输出:
This bird is 5
我们定义了一个改变属性值的方法 update_age()
,通过调用 update_age()
来改变属性的值。
三、继承
在创建类时,不必每次都从零开始,假设我们想要创建的新类和已经创建过的类之间有一些共同的属性和方法,我们就可以从某个现有的类继承,新类称为子类,被继承的类称为父类。继承时,子类会获取父类的所有属性和方法,并且子类还可以定义自己的属性和方法。
子类继承父类语法:class 子类名(父类名)
多继承:class 子类名(父类名1, 父类名2, ..., 父类名n)
1、子类的__init__() 方法
在实例化子类的对象时,首先要为父类中的属性赋值,对父类属性的赋值可以使用父类的 __init__()
方法。
class Bird:
def __init__(self, n, c, s):
self.name = n
self.color = c
self.size = s
self.age = 1
def get_description(self):
description = f'{self.name} {self.color} {self.size} '
print(description)
def get_age(self):
print(f"This bird is {self.age} ")
def update_age(self, a):
self.age = a
class Penguin(Bird):
def __init__(self, n, c, s):
super().__init__(n, c, s)
my_bird = Penguin('企鹅', '黑白', '大')
my_bird.get_description()
输出:
企鹅 黑白 大
在上面的例子中,定义了一个子类 Penguin
,继承自 Bird
。在子类 Penguin
的 __init__()
方法中调用父类 Bird
的 __init__()
方法对父类中的属性进行赋值。语句中的 super()
函数是用于调用父类的一个方法。
2、定义子类自己的属性和方法
class Bird:
def __init__(self, n, c, s):
self.name = n
self.color = c
self.size = s
self.age = 1
def get_description(self):
description = f'{self.name} {self.color} {self.size} '
print(description)
def get_age(self):
print(f"This bird is {self.age} ")
def update_age(self, a):
self.age = a
class Penguin(Bird):
def __init__(self, n, c, s):
super().__init__(n, c, s)
self.swimming_distance = 100
def get_swimming_distance(self):
print(f"企鹅可以游 {self.swimming_distance} 米.")
my_bird = Penguin('企鹅', '黑白', '大')
my_bird.get_description()
my_bird.get_swimming_distance()
输出:
企鹅 黑白 大
企鹅可以游 100 米.
为子类添加了属性 swimming_distance
和方法 get_swimming_distance()
,通过访问属性和方法打印出相应的结果。
四、方法重写
如果父类方法无法满足要求,可以在子类中进行重写。
#!/usr/bin/python3
class Parent: # 定义父类
def myMethod(self):
print ('调用父类方法')
class Child(Parent): # 定义子类
def myMethod(self):
print ('调用子类方法')
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
输出:
调用子类方法 调用父类方法
super() 用于调用父类的方法
五、属性、方法
1、私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
2、私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。
class Site:
__foo = "私有变量"
foo1 = "公共变量"
def __init__(self, name, url):
self.name = name #公开变量
self.__url = url #私有变量
def who(self):
print(self.foo1)
print("name:", self.name)
print("url:", self.__url)
def __privatef(self):
print("私有方法")
def publicf(self):
print("公共方法")
x = Site("测试类", "wwww.com.cn") #实例化
print(x.foo1) #正常输出
#print(x.__foo) #去掉注释后,执行报错,no attribute
x.who() #正常输出
x.publicf() #正常输出
x.__private() #报错
输出:
Traceback (most recent call last): File "D:\project\Python\test_class.py", line 25, in <module> x.__private() #报错 AttributeError: 'Site' object has no attribute '__private' 公共变量 公共变量 name: 测试类 url: wwww.com.cn 公共方法
类的专有方法:
- __init__ : 构造函数,在生成对象时调用
- __del__ : 析构函数,释放对象时使用
- __repr__ : 打印,转换
- __setitem__ : 按照索引赋值
- __getitem__: 按照索引获取值
- __len__: 获得长度
- __cmp__: 比较运算
- __call__: 函数调用
- __add__: 加运算
- __sub__: 减运算
- __mul__: 乘运算
- __truediv__: 除运算
- __mod__: 求余运算
- __pow__: 乘方