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}
posted @ 2022-05-01 23:40  槐序八  阅读(44)  评论(0)    收藏  举报