黑马程序员技术交流社区
标题:
常见盲区误区
[打印本页]
作者:
Moonbria
时间:
2018-8-1 23:38
标题:
常见盲区误区
第一部分 类相关
1.私有属性和方法可不可以被继承:
在子类内部是无法使用父类的私有方法和属性的,使用super()调用父类私有方法或属性,有智能提示(pycharm)但是还是无法使用。
在子类实例对象下 可以用 子类对象._父类名__私有方法/属性名来调用私有方法和属性。
假如父类公有方法包含对其私有方法的调用,子类可以通过调用公有方法访问私有方法和属性。所以私有方法和属性,算是可以被继承。
2.类属性和实例属性
测试函数
class Tools(object):
tools_count = 0
def __init__(self):
self.tools_count += 1
tool1 = Tools()
print(Tools.tools_count)
print(tool1.tools_count)
tool2 = Tools()
print(Tools.tools_count)
print(tool2.tools_count)
核心问题还是互相访问
运行结果 0\n1\n0\n1
说明类属性未被更改,init函数借用Tools.count的初始值创建了一个实例属性self.count
也说明类属性和实例属性同名,用实例对象访问,得到的是实例属性的值。
将init中的self改成Tools
输出结果是 1\n1\n2\n2
如果在外部更改tool2的count属性,不会更改类属性。即类属性只能通过类对象修改,使用实例对象对类属性操作 会生成一个对象的实例属性,并不会改变类属性 实例属性当然也不能通过类对象更改
实例对象可以访问类属性
类对象不可以访问实例属性 使用类名.实例属性会报错,但是如果在实例方法内部加上对象名,可以访问
类属性可以在方法中定义和修改。就是在函数中使用类名.或者类名= 的方式可以定义一个类属性
3.__new__和__init__
new函数是一个特殊的静态函数
new函数返回一个实例对象的内存地址的引用,所以它一定有返回值
init函数接收new函数的结果,初始化一个实例
第二部分 变量和函数
测试函数
age = []
a = 1
def foo2():
a = 2
print(a)
age = [1]
print(age)
foo2()
print(age)
print(a)
测试结果
2\n[1]\n[]\1
1.全局变量和局部变量
在函数内部对与全局变量同名的局部变量使用赋值语句,会生成一个同名局部变量,可变不可变类型都会如此
在函数内部对可变类型使用方法,会直接改变全局变量的值,对不可变类型无法使用方法
特别说明:对于列表 如果使用+= 相当于调用extend方法,会更改全局变量的值 但是如果是使用
list = list + list2 则相当于使用了赋值语句
2.global的相关
global a 意思是对a是全局变量的声明 可以先声明再定义,但是不能直接global a = 1 这样直接定义
所以global可以声明全局变量,但是不能定义全局变量
如果有同名,使用global相当于把原来对于局部变量的指针修改到了全局变量上,所以可以更改全局变量的指向
3.缺省参数和不定长参数
测试函数
foo(a=1, **kwargs)
一般来说,函数参数传递顺序是,必须传的参数,缺省参数,不定长参数。
缺省参数可以放到不定长参数后面,但是不定长参数必须为*args,如果放在**kwargs后面,会直接报错。
4.函数的命名可以使用小驼峰命名法(PEB8并不买账)
第三部分
变量的各种方法
1.几个不怎么常用的方法
字符串
string.partition(str) 从左到右 以第一个符合要求的字符串,如果没有,生成两个空元素的元组
string.rpartition 从右开始查找的partition
string.split() 把对应str删除,分隔成列表 num则表示从左到右至多去除多少个 会让\t等变成不可识别状态 并且可以删除
spring.splitlines() 按照其作为分隔线 \t不识别 注意
a.join(b) 在a的每一个元素中间插入一个b
字典
dic2 = dict.formkeys(list,values) 所有的values 都是同一个values (静态)
b=dict.copy() 不能使用b=a 这样得到的a和b是同一个内存区域 相当于这个对象的引用计数为2,只有把两个引用计数都删除之后,对应字典的内容才会被清除
dict.get(n) 没有key会显示none
dict.setdefault(a,b) 无法更改已存在的键值对 如果key已存在 无法更改values
dict.popitem() 字典是没有顺序的 所以是先通过 iter 方法将其转化为可迭代对象
dict.items() 显示dict所有元素 和他的类型 dict
2.标识符的命名规则
只要不和关键字冲突就可以,比如,在不是定义函数名的情况下使用__init__作为变量名是没问题的。
注意模块名不要和内置模块名冲突,否则可能导致对应功能无法调用
1358个字 差不多够了 下次见 *_*
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2