【JS逆向基础】面向对象
1,OOP编程思想
面向对象编程是在面向过程编程的基础上发展来的,它比面向过程编程具有更强的灵活性和扩展性。面向对象编程是程序员发展的分水岭,很多初学者会因无法理解面向对象而放弃学习编程。
面向对象编程(Obiect:oriented Programming,简称 OOP),是一种封装代码的方法。其实,在前面章节的学习中,我们已经接触了封装,比如说,将数据放进列表和字典中中,这就是一种简单的封装,是数据层面的封装,把常用的代码块打包成一个函数,
这也是一种封装,是语句层面的封装。
代码封装,其实就是隐藏实现功能的具体代码,仅留给用户使用的接口,就好像使用计算机,用户只需要使用键盘、鼠标就可以实现一些功能,而根本不需要知道其内部是如何工作的。
本节所讲的面向对象编程,也是一种封装的思想,不过显然比以上两种封装更先进,它可以更好地模拟真实世界里的事物,并把描述特征的数据和代码块(函数)封装到一起。
2,类与实例对象
2.1,类和对象的概念
类是人们抽象出来的一个概念,所有拥有相同属性和功能的事物称为一个类;而拥有相同属性和功能的具体事物则成为这个类的实例对象。
2.2,声明类和实例化对象
面向对象最重要的概念就是类(Class)和实例(instance),必须牢记类是抽象的模板,比如Person类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
案例演示:首字母大写
class Person(object):pass
p1 = Person( )
p2 = Person( )#eg
class Person():#属性isemotion = True#功能def say():print("说话")
每一个人的实例对象都应该有自己的属性,比如姓名和年龄,实例变量的赋值如下:
实例变量的增删改查
pl.name = "alvin"
pl.age = 18
p2.name = "yuan"
p2.age = 22
print(p1.gender)
del p2.age
2.3、对象的属性初始化
在创建类时,我们可以手动添加一个 init()方法,该方法是一个特殊的类实例方法,称为构造方法(或构造函数) init () 方法可以包含多个参数,但必须包含一个名为 self 的参数,且必须作为第一个参数。在init_()构造方法中,除了 self 参数外,还可以自定义一些参数,参数之间使用逗号,进行分割,从而完成初始化的工作
#=====================================================类对象
class Person(object):# 类变量-----类空间name = "yuan"age = 11num = 23# 实例空间def __init__(self, hei, num):# print("self:",self)self.hei = hei #实例变量self.num = num# 当两个类进行比较的时候此接口会起作用def __eq__(self, other):if self.num == other.num:return Trueelse:return Falsedef thinking(self):print(f"{self.name}thinking")Person.age = 100 #类对象更改之后,后续所有的操作都将变成100p1 = Person(175,2)
p2 = Person(175,3)print(p1.age)
print(p2.age)
#======================================================类方法
class Person(object):# 类变量-----类空间name = "yuan"age = 11num = 23# 实例空间def __init__(self, hei, num):# print("self:",self)self.hei = hei #实例变量self.num = num@staticmethod #加上此作为修饰则下面的接口可以不传参数def add_num():Person.num += 1def show_num(self):print(self.num)print(Person.num)@classmethod #类方法,传进的就直接是Persondef show_age(cls):print(cls.age)Person.age = 100 #类对象更改之后,后续所有的操作都将变成100p1 = Person(175,2)
p2 = Person(175,3)p1.add_num()
p1.show_num()
print(p1.age)
3,面向对象之继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
class 派生类名(基类名)
3.1、继承的基本使用
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率。
实际上继承者是被继承者的特殊化,它除了拥有被继承者的特性外,还拥有自己独有得特性。例如猫有抓老鼠、爬树等其他动物没有的特性。同时在继承关系中,继承者完全可以替换被继承者,反之则不可以,例如我们可以说猫是动物,但不能说动物是猫就是这个道理,其实对于这个我们将其称之为“向上转型”。
诚然,继承定义了类如何相互关联,共享特性。对于若干个相同或者相识的类,我们可以抽象出他们共有的行为或者属相并将其定义成一个父类或者超类,然后用这些类继承该父类,他们不仅可以拥有父类的属性、方法还可以定义自己独有的属性或者方法。
同时在使用继承时需要记住三句话:
1,子类拥有父类非私有化的属性和方法。
2,子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
3,子类可以用自己的方式实现父类的方法。(下面会介绍)
class Anmial(object):def eat(self):print("eat...")def drink(self):print("drink...")class Cat(Anmial): #继承Anmial的所有属性def tree(self):print("tree...")class Dog(Anmial): #继承Anmial的所有属性def swimming(self):print("swimming...")# 当所在类对象没有的时候,会依次从父类寻找
c1 = Cat()
d1 = Dog()
c1.eat()
c1.drink()
d1.eat()
d1.drink()
3.2,多类继承与继承的重新改写
class Anmial(object):def eat(self):print("eat...")def drink(self):print("drink...")
class Flying(object):def fly(self):print("flying...")class Cat(Anmial): #继承Anmial的所有属性def tree(self):print("tree...")class Dog(Anmial): #继承Anmial的所有属性def swimming(self):print("swimming...")# 多类继承
class Bird(Anmial,Flying):passclass Anmial_1(Anmial): #继承父类的重改写def eat(self):# 用到继承到的父类方法super().eat() # Anmial().eat()print("eat11111...")# 当所在类对象没有的时候,会依次从父类寻找
c1 = Cat()
d1 = Dog()
c1.eat()
c1.drink()
d1.eat()
d1.drink()a2 = Anmial_1()
a2.eat()b1 = Bird()
b1.fly()
4,dir方法
class Person(object):name = "name"# 实例空间def __init__(self, hei, num):# print("self:",self)self.hei = hei #实例变量self.num = numdef add_num(self):Person.num += 1Person.age = 100 #类对象更改之后,后续所有的操作都将变成100p1 = Person(175,2)
print("获取所有的属性列表")
print(dir(p1))#获取自定义的属性对象
print(p1.__dict__)