五个高级python知识总结

编程入门 行业动态 更新时间:2024-10-27 19:16:14

五个<a href=https://www.elefans.com/category/jswz/34/1770104.html style=高级python知识总结"/>

五个高级python知识总结

五个高级python知识总结

- 类变量和实例变量

1.实例变量只能通过类的实例进行调用
2.修改模板对象创建的对象的属性,模板对象的属性不会改变
3.修改模板对象的属性,由模板对象创建的对象的属性会改变

# 此处的类也是模板对象,Python中一切皆对象
class A(object):#类变量number = 12def __init__(self):# 实例变量self.number_2 = 13# 实例变量只能通过类的实例进行调用
print(A.number)      # 12
print(A().number)    # 12
print(A().number_2)  # 13# 修改模板对象创建的对象的属性,模板对象的属性不会改变
a = A()
a.number = 18
print(a.number)      # 18
print(A().number)    # 12
print(A.number)      # 12# 修改模板对象的属性,由模板对象创建的对象的属性会改变
A.number = 19
print(A.number)      # 19
print(A().number)    # 19

- 类和实例属性以及方法的查找顺序
1.在Python 2.2之前只有经典类,到Python2.7还会兼容经典类,Python3.x以后只使用新式类,Python之前版本也会兼容新式类
2.Python 2.2 及其之前类没有基类,Python新式类需要显式继承自object,即使不显式继承也会默认继承自object
3.经典类在类多重继承的时候是采用从左到右深度优先原则匹配方法的.而新式类是采用C3算法
4.经典类没有MRO和instance.mro()调用的

假定存在以下继承关系:

class D(object):def say_hello(self):passclass E(object):passclass B(D):passclass C(E):passclass A(B, C):pass

采用DFS(深度优先搜索算法)当调用了A的say_hello()方法的时候,系统会去B中查找如果B中也没有找到,那么去D中查找,很显然D中存在这个方法,但是DFS对于以下继承关系就会有缺陷:

class D(object):passclass B(D):passclass C(D):def say_hello(self):passclass A(B, C):pass

在A的实例对象中调用say_hello方法时,系统会先去B中查找,由于B类中没有该方法的定义,所以会去D中查找,D类中也没有,系统就会认为该方法没有定义,其实该方法在C中定义了。所以考虑使用BFS(广度优先搜索算法),那么问题回到第一个继承关系,假定C和D具备重名方法,在调用A的实例的方法时,应该先在B中查找,理应调用D中的方法,但是使用BFS的时候,C类中的方法会覆盖D类中的方法。在Python 2.3以后的版本中,使用C3算法:

# 获取解析顺序的方法
类名.mro()
类名.__mro__
inspect.getmro(类名)

使用C3算法后的第二种继承顺序:

class D(object):passclass B(D):passclass C(D):def say_hello(self):passclass A(B, C):passprint(A.mro()) # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>]

使用C3算法后的第一种继承顺序:

class D(object):passclass E(object):passclass B(D):passclass C(E):passclass A(B, C):passprint(A.mro()) 
# [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>]

在这里仅介绍了算法的作用和演变历史

- 类方法、实例方法和静态方法

class Demo(object):# 类方法@classmethoddef class_method(cls, number):pass# 静态方法@staticmethoddef static_method(number):pass# 对象方法/实例方法def object_method(self, number):pass

实例方法只能通过类的实例来调用;静态方法是一个独立的、无状态的函数,紧紧依托于所在类的命名空间上;类方法在为了获取类中维护的数据,比如:

class Home(object):# 房间中人数__number = 0@classmethoddef add_person_number(cls):cls.__number += 1@classmethoddef get_person_number(cls):return cls.__numberdef __new__(self):Home.add_person_number()# 重写__new__方法,调用object的__new__return super().__new__(self)class Person(Home):def __init__(self):# 房间人员姓名self.name = 'name'# 创建人员对象时调用Home的__new__()方法tom = Person()
print(type(tom))   # <class '__main__.Person'>
alice = Person()
bob = Person()
test = Person()print(Home.get_person_number())

- 数据封装和私有属性

Python中使用双下划线+属性名称实现类似于静态语言中的private修饰来实现数据封装。

class User(object):def __init__(self, number):self.__number = numberself.__number_2 = 0def set_number(self, number):self.__number = numberdef get_number(self):return self.__numberdef set_number_2(self, number2):self.__number_2 = number2# self.__number2 = number2def get_number_2(self):return self.__number_2# return self.__number2u = User(25)
print(u.get_number())  # 25
# 真的类似于Java的反射机制吗?
print(u._User__number) # 25
# 下面又是啥情况。。。想不明白了T_T
u.set_number_2(18)
print(u.get_number_2()) # 18
print(u._User__number_2) 
# Anaconda 3.6.3    第一次是:u._User__number_2   第二次是:18
# Anaconda 3.6.5    结果都是 0 # 代码我改成了正确答案,感谢我大哥给我指正错误,我保留了错误痕迹
# 变量名称写错了,算是个写博客突发事故,这问题我找了一天,万分感谢我大哥,我太傻B了,犯了低级错误
# 留给和我一样的童鞋参考我的错我之处吧!# 正确结果:
# 25  25  18  18

- Python的自省机制

  • 自省(introspection)是一种自我检查行为。在计算机编程中,自省是指这种能力:检查某些事物以确定它是什么、它知道什么以及它能做什么。自省向程序员提供了极大的灵活性和控制力。
  • dir([obj]):返回传递给它的任何对象的属性名称经过排序的列表(会有一些特殊的属性不包含在内)
  • getattr(obj, attr):返回任意对象的任何属性 ,调用这个方法将返回obj中名为attr值的属性的值

感谢阅读!!!

更多推荐

五个高级python知识总结

本文发布于:2023-07-28 22:06:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1335990.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:高级   知识   python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!