Object Oriented Programming,简称 OOP,是一种程 序设计思想。
OOP 把对象作为程序的基本单元(一切皆为对象)
面向对象的程序设计把计算机程序视为多个对象的集合
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
对象可以包含任意数量和类型的数据。
class 类名(父类): 属性 方法 class stu(object): name = “zhangsan” def sleep(self): print(“I am sleeping”) #name: 属性 #sleep函数:方法
obj = stu() #实例化一个stu类的对象obj print(obj.name) #访问类中的属性 obj.sleep() #调用类中的方法
类在实例化一个对象的时候会自动调用__init__方法。
obj = stu() #此时对应的 __init__() 方法就会被调用
当然, __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。
class stu(object): def __init__(self, name, age): self.name = name self.age = age obj = stu(‘zhangsan‘, 18) print(obj.name, obj.age)
self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。
class stu: def add(self): print(self) print(self.__class__) obj = stu() obj.add() 运行结果: <__main__.stu object at 0x000001940D4715C0> <class ‘__main__.stu‘>
通过__init__方法的默认参数实现:实例化对象的时候既可以传参也可以不传参。
class stu(object): def __init__(self, name="zhangsan", age=18): self.name = name self.age = age s = stu() print(s.name,s.age) 运行结果: zhangsan 18
class stu(object): def __init__(self, name, age): self.name = name #定义属性name self.age = age #定义属性age
在类的外部访问:object.属性 object.方法 (object为对象名)。
class stu(object): name = “zhangsan” def sleep(self): print(“I am sleeping”) s = stu() print(s.name) s.sleep()
在类的内部访问:self.属性 self.方法(实参列表)
class Test(object): def __init__(self, name): self.name = name def func1(self): print(self.name) def func2(self): self.func1()
类中的属性默认是可以在类的外部通过类的实例化对象访问的。
如果希望内部属性不被外部访问(对象通过句点符号引用),可以在属性名称前加上 双下划线 __, 该属性则为私有属性,只能在类内部访问。
class Test(object): def __init__(self, name): self.__name = name def func1(self): print(self.__name)
通过类的实例化对象访问和修改私有属性。
class Test(object): def __init__(self, name=None): self.__name = name def get_name(self): return self.__name def set_name(self, name): self.__name = name s = Test() s.set_name(‘zhangsan‘) name = s.get_name() print(name)
到底封装的是什么?
-属性(数据)
-方法
面向对象编程的优点之一:代码重用。实现代码重用的方法 -> 继承
类的非私有方法和非私有属性可以继承给他的子类
继承的类:子类、派生类
被继承的类:父类、基类
继承基类的方法:
class Animal(object): def run(self): print(‘Animal run‘) class Dog(Animal): pass d = Dog() d.run()
继承基类属性:
#继承非私有属性 class Animal(object): def __init__(self, name): self.name = name class Dog(Animal): pass d = Dog("wangcai") print(d.name)
多重继承:
假设我们要实现以下4种动物: Dog - 狗狗 Bat - 蝙蝠 Parrot - 鹦鹉 Ostrich - 鸵鸟。
如果按照哺乳动物和鸟类归类,我们可以设计出这样的类的层次:
class Animal(object): pass # 大类: class Mammal(Animal): pass class Bird(Animal): pass # 各种动物: class Dog(Mammal): pass
class Manmal(object): def run(self): print(‘Running...‘) class Flyable(object): def fly(self): print(‘Flying...‘) class Bat(Manmal, Flyable): pass
一个类的方法有多种形态。
子类继承父类的方法时,如果需要对父类的方法进行修改,则需要在子类中对该方法进行“重写”。
class Animal(object): def __init__(self, name): self.__name = name def run(self): print(‘animal run‘) class Dog(Animal): #重写 def run(self): print(‘dog run‘) super().run() d = Dog("dog") d.run()
获取对象信息:
type()
isinstance()
dir()
获得一个对象的所有属性和方法,可以使用 dir()函数,它返回 一个包含字符串的 list。
对象的构造和内存的分配
一个类只能构造一个对象,在实际工作过程中某些事物就是唯一的!!
考察的核心:一个对象的构造的过程:__new__() -> __init__()
class Earth(object): Instance = None #注意:__new__的参数是cls 而是不是self #cls:这个类本身 #首先我们需要明白一件事情:构造一个对象其实就是需要在内存中开辟一块空间 #如果我们使用某个类来构造一个对象,对象的内存空间的分配是由类实现的 #重写object类中的__new__ def __new__(cls, *args, **kwargs): #如果这个类构造过对象,不需要重新分配空间了 if cls.Instance == None: #如果这个类没有构造过对象,则需要分配空间 cls.Instance = super().__new__(cls,*args, **kwargs) #print(type(Instance)) return cls.Instance else: return cls.Instance earth = Earth() print(earth) earth = Earth() print(earth)
class A: def add(self, x): y = x+1 print(y) class B(A): def add(self, x): super().add(x) b = B() b.add(2) # 3
class Earth(object): _instance = None def __init__(self): print("Hi, I Am The Earth") def __new__(cls): # 如果这个类在此之前没有构造过对象,则构造一个对象 if cls._instance == None: print("new earth") cls._instance = super().__new__(cls) # print(type(cls._instance)) return cls._instance # 如果这个类再此之前已经构造过对象,则不构造对象返回原来的对象 else : return cls._instance e1 = Earth() e2 = Earth() print(id(e1), id(e2))
class Dog(object): def swimming(self): print(‘dog swimming‘) def func(obj): obj.swimming() duck = Duck() dog = Dog() func(duck) func(dog)
原文:https://www.cnblogs.com/-Leif/p/12944241.html