4.7python学习笔记
类相关方法及操作
静态方法与动态方法的区别
# 对象调用绑定给对象的方法:会自动将对象当作第一个参数传入
# 对象调用绑定给类的方法:也不需要传参,会将产生该对象的类自动当做第一个参数传入,其实就是把外层类名传入内层类参数,相当于外层类是内层类的父类,然后通过对象调用内外层类
#静态方法:即普通的函数,定义之后就不会自动传self,但是括号内有几个参数就必须传几个参数
动态方法
(1)绑定给对象的方法
class Student:
def run(self):
print(self)
Student.run(123) # 类调用绑定给对象的方法:有几个参数就需要传几个参数
obj = Student()
obj.run() # 对象调用绑定给对象的方法:会自动将对象当作第一个参数传入
(2)绑定给类的方法
class Student:
@classmethod # 定义类方法关键字
def eat(cls): # 参数一般写cls,约定俗成
print(cls)
# 类调用绑定给类的方法:会自动将类当做第一个参数传入
print(Student) # <class '__main__.Student'>
Student.eat() # <class '__main__.Student'>)
obj1.eat()
静态方法
class Student:
@staticmethod # 定义静态方法关键字
def speak(a):
print(a)
静态方法:即普通的函数,定义之后就不会自动传self,但是括号内有几个参数就必须传几个参数
# 类调用静态方法:要自己传值
Student.speak(123)
# 对象调用静态方法:也要自己传值
obj1.speak(321)
面向对象的三大特征
#封装
封装的概念:就是将复杂的信息、流程给包起来,内部处理,让使用者只需要通过简单的操作步骤,就能实现。
#继承
基本概念:在面向对象的世界中,从父类继承,就可以直接拥有父类的属性和方法,这样可以减少代码、多复用。子类可以定义自己的属性和方法
基本使用:
"""
class A(B):
pass
我们将被继承的类称为:父类或者基类 B
继承别人的类称为:子类或者派生类 A
"""
如果类定义时,没有继承别的类,等同于继承自object。在Python3中,object类是所有对象的根基
类
class A:
pass
# 等价于
class A(object):
pass
在python中一个类可以同时继承多个父类
class A(B,C,D):
pass
继承中__init__()方法
__init__方法的作用是初始化类中的属性。当你创建实例的时候,类中的__init__方法会自动执行。不
需要你显式的调用。
'''
class A(object):
def __init__(self):
print('._init_方法已执行')
example1 = A()
._init_方法已执行
'''
注意:__init__()方法中第一个形参必须是 self。 形参self做作用很大。每个与类相关联的方法
调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
1.子类没有定义自己的初始化函数,父类的初始化函数会被默认调用
2.子类定义了自己的初始化函数,而在子类中没有显式调用父类的初始化函数,则父类的属性不会被初始化
3.如果子类定义了自己的初始化函数,显式调用父类,子类和父类的属性都会被初始化
总结
1、子类中若有__init__()方法,则创建实例时传入的参数,须与__init__()方法中形参数量一致(self不算在内)
2、这三种情况,父类中的方法都是可以调用的
3、使用子类创建实例的时候,父类的初始化方法必须被子类显式调用才会执行。而子类的初始化方法会自动执行
派生类
概念:如果自己写的子类需要使用父类的方法 并且还需要基于该方法做扩展
这样的子类我们称之为派生类(本质还是子类)
那么可以使用super关键字来实现
首先定义父类和子类
class Person:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
子类:teacher
class Teacher(Person):
def __init__(self,name,age,gender,level,salary):
# 用了Person类里面的__init__方法之后,如何创建自己的特有属性呢
两种写法:
1.super(Teacher,self).__init__(name,age,gender) # 子类调用父类的方法 完整语法
2.super().__init__(name,age,gender) # 子类调用父类的方法 精简语法
# 自己还要添加一个额外的东西
self.level = level
self.salary = salary
子类:student
class Student(Person):
def __init__(self,name,age,gender,stu_id,class_id):
# 用了Person类里面的__init__方法之后
super().__init__(name, age, gender)
# 自己还要添加一个额外的东西
self.stu_id = stu_id
self.class_id = class_id
t1 = Teacher('jason',18,'male','满级',3.1) # 使用父类方法
s1 = Student('kevin',28,'female',1302010201,2)
print(t1.__dict__)
print(s1.__dict__)
派生功能前瞻
class MyClass(list): # 可直接继承内置方法
def append(self,args): # 自己定义一个append方法
if args == 123: # 判断条件后执行后面代码
print('数字123不能追加')
return
super(MyClass, self).append(args) # 筛选条件后添加传进来的args
obj1 = MyClass() # 生成对象obj
obj1.append(333) # 走super方法,添加数据到obj
obj1.append(222) # 走super方法,添加数据到obj
obj1.append(123) # 走if判断,直接退出
print(obj1) # {333,222}

浙公网安备 33010602011771号