面向对象大串讲

类与对象
	-class Person():
    -p=Person()
属性查找
	-p.name:先找对象自己,找不到去类中找,再找不到报错
类属性和对象属性
	-分别再不同的名称空间
对象的绑定方法
	-特殊之处,对象来调用,会自动传值,把对象自己传过来,当那个对象来调用,self就是谁
    -类也可以来调用,类调用就是普通函数,有几个参数就要传几个参数
函数和方法
	-
类与数据类型(类即类型)
	-
类的继承(python支持多继承)
继承后属性查找顺序
派生(子类中新定义的属性或方法)
super()特殊的对象
	
多继承下的super(FatBossGril.__mro__)
组合(属性的值是指向另外一个类的对象)
	
多态与多态性
 -多态指的是一类事物有多种形态
 -多态性:一种调用方式,不同的执行效果
封装,隐藏属性
property
类方法,对象方法,静态方法
isinstanceissubclass
isinstancetype
反射getattrsetattrhasattrdelattr
__setattr__和__delattr__和__getattr__
 -添加/修改属性会触发它的执行
 -删除属性的时候会触发
 -只有在使用点调用属性且属性不存在的时候才会触发
 -递归现象:object.__setattr__(self,'storage',{
    
    })(没讲)
__setitem__和__getitem和__delitem__(没讲)
__init__和__new__(不讲了)
其他魔法方法(不讲了)
元类(不讲了)
 -type:所有类的类,但是继承object
 -object:所有类的父类,同时由type生成


一切皆对象之函数对象
# 类属性和对象属性
class Person:
	name = 'lqz'


p = Person()
p.name = 'egon'  # 只是改了对象自己名称空间中的name,不会影响到类的name
print(p.name)

p1 = Person()
p1.name = 'tank'
print(p1.name)

Person.name = 'xxx'


# 2对象绑定方法
class Person:
	name = 'lqz'

	def play(self):
		print('2绑定方法')


#  特殊之处,对象来调,会自动传值,把对象自己传过来,当那个对象来调用,self就是谁

p = Person()
p.play()
# 类也可以来调用,类调用就是普通函数,有几个参数就要传几个参数

Person.play([1, 2])  # 普通函数,怎么传值都行

# 3函数和方法  本质区别就是看谁来调用,对象调用就是方法,类调用就是普通函数

# 可以用types模块查看是函数还是方法
from types import FunctionType, MethodType


class Person:
	name = 'lqz'

	def play(self):
		print(self.name)


print('3.1', isinstance(Person.play, FunctionType))  # 类来调用,play就是普通函数
print('3.2', isinstance(Person.play, MethodType))  # 不是方法,打印false

p = Person()
print('3.3', isinstance(p.play, FunctionType))  # 对象来调用,play就是方法
print('3.4', isinstance(p.play, MethodType))

# 4 类与数据类型
l = [1, 2, 3]
dic = {
    
    'name': 'egon', 'age': 12}

p = Person
print(type(p))
print(type(l))


# 5 类的继承
class Human:
	name = 'lqz'

	def test(self):
		print('test')


class People(Human):
	name = 'egon'


# 6 派生:子类多出来的属性和方法,重写父类的方法

# 7 super()是一个特殊的对象,
class Human:
	name = 'lqz'

	def test(self):
		print('test')


class Animal():
	def test2(self):
		print('test2')


class People(Human):
	name = 'egon'

	def test(self):
		super().test()  # 代指Human,
		super().test2()


# 8 组合,属性的值指向另一个类的对象

class Human:
	name = 'qgz'

	def __init__(self, name):
		self.name = name


class Animal:
	pass


h = Human('oko')  # 这也是组合,str也是一个对象
print(h.name)
h1 = Human(Animal())  # 组合
print(h1)


# 9 多态与多态性
# 多态指食物的多种形态
# 多态性:一种调用方式,不同的执行方式

class Human:
	def test(self):
		print('Human play')


class Animal:
	def test(self):
		print('Animal play')


def print_test(obj):
	obj.test()


h = Human()
a = Animal()

print_test(h)
print_test(a)


# 10 封装,不是隐藏属性,只要把一个对象放到另一个对象中就叫封装

# 隐藏属性,把属性或者方法隐藏起来,只在内部用,不对外提供
# 不管是属性还是方法用 __开头就隐藏了
# 外部通过__类名_属性/方法(其他语言就是调不了)
# 外部想用,开发一个接口(别的方法,加限制使用)

# 11, property 把方法包装成数据的属性,

# 12、类方法,对象方法,静态方法

class Human:
	def __init__(self, name):
		self.name = name

	@classmethod
	def clamet(cls):
		pass


# 13 isinstance 和 issubclass

# isinstance:判断对象是不是某个类的实例
# issubclass:

class Animal():
	pass


class Human(Animal):
	pass


# 14 反射 getattr, setattr,hasattr,delattr

# 动态的从对象中获取值(属性或者方法),或者放,判断对象中有没有没有这个值

# 15魔法方法

class Person():
	def __setattr__(self, key, value):
		print('setattr')

	def __getattr__(self, item):
		print('getattr')
		return 1


# 16 一切皆对象之函数对象,

def test():
	print('xx')


test.name = 'qqz'

test()
print(test.name)
# 正因为函数是对象,所以它可以赋值给变量,可以当作返回值,可以当做参数

猜你喜欢

转载自blog.csdn.net/qq_40808228/article/details/108318951