一。python中一切皆是对象
1.动态语言和静态语言的区别
java虽然也是面向对象,但是在其中有类和实例(对象)这两个对象
python是所有的都是对象,面向对象更加彻底
2.python中函数和类也是对象,属于python的一等公民,一等公民有这几个特权
可以赋值给一个变量
可以添加到集合对象中
可以作为参数传递给函数
可以当做函数的返回值
def ask(name="bobby"):#如果函数没有renturn,会默认返回None
print(name)
class Person:
def __init__(self):
print("bobby1")
def print_type(item):
print(type(item))
def decorator_fun():
print("des start")
return ask #特等公民特权4
obj_list = []
obj_list.append(ask)
obj_list.append(Person) #一等公民特权2
for item in obj_list:
print(type(item))
my_func = ask
my_func("bobby")
二.type,object,class的区别
#type–>int–>1
#type–>class–>obj
object是最顶层的基类,object的基类为空
type本身也是一个类,同时type也是一个对象
三. python中的内置对象【对象的三个特征(身份,类型,值)】
1.身份用id()查看
2.类型
None 全局只有一个
数值 int, float, complex, bool
迭代类型
序列类型 list, bytes, bytearray, memoryview(二进制序列), range, tuple, str, array
映射类型 dict
集合 set, frozenset
上下文管理类型 with语句
其他类型 模块类型,class和实例,函数类型,方法,代码类型,object对象,type类型,ellipsis类型(省略号),notimplemented类对象
python魔法方法
什么是魔法函数
1.以上下划线开头,以双下滑线结尾的 就是python中的魔法方法
2.魔法函数 可以在任何类中直接使用,用于增强。【for 会调用对量内部的 __getitem__魔法方法】
3.将一个类变为可以调用len方法的形式
class Company(object):
def __init__(self,employee_list):
self.employee = employee_list
def __getitem__(self,item):
return self.employee[item]
def __len__(self):'
return len(self.employee)
company = Company(["tom","bob","jane"])
company1 = company[:2]
pirnt(len(conpany))
for em in company1:
print(em)
魔法函数有哪些
1.非数学运算
字符串表示 repr, str
集合,序列相关 len, getitem, setitem, delitem, contains
迭代相关 iter, next,
可调用 call
with上下文管理器 enter, exit,
数值转换 abs, bool, int, float, hash, index
元类相关 new, init,
属性相关 getattr, setattr, getattribute, setattribute, dir
属性描述符 get, set, delete
协程 await, aiter, anext, aenter, aexit
2.数学运算
class MyVector(object):
...: def __init__(self,x,y):
...: self.x = x
...: self.y = y
...: def __add__(self,other_instance):
...: re_vector = MyVector(self.x+other_instance.x,self.y+other_instance.y)
...: return re_vector
...: def __str__(self):
...: return "x:{x},y:{y}".format(x=self.x,y=self.y)
In [3]: first_vec = MyVector(1,2)
In [4]: second_vec = MyVector(2,3)
In [5]: print(first_vec+second_vec)
四 鸭子类型
1.什么是鸭子类型
class Cat(object):
def say(self):
print('i an a cat')
class Dog(object):
def say(self):
print('i am a dog')
def __getitem__(self,item):
return "bobby"
class Company(object):
def __init__(self,employee_list):
self.employee = employee_list
def __getitem__(self,item):
return self.employee[item]
def __len__(self):
return len(self.employee)
company = Company(['tom','bob','jane'])
class Duck(object):
def say(self):
print("i am a duck")
animal_list=[Cat,Dog,Duck]
for animal in animal_list:
animal().say()
定义有相同的函数,就说明看起来就一类东西(鸭子),所以就说他是鸭子类型
魔法函数的思想与鸭子类型的思想相同,在所有类中定义了 __getitem__方法,这个类就具备的迭代的特性