python高级2
1. Python中类方法、类实例方法、静态方法有何区别?
class Test(object):
def __init__(name,age):
self.name = name
self.age = age
@classmethod
def test1(cls,name): # cls,类对象
obj = cls(name,18) # 类对象可以创建实例对象
@staticmethod
def test2():
pass
def test3(self): # self,实例对象
pass
test = Test("sss",19)
- 类方法:是类对象的方法,在定义时需要在上方使用“@classmethod”进行装饰,形参为 cls, 表示类对象,类对象和实例对象都可调用;
- 类实例方法:是类实例化对象的方法,只有实例对象可以调用,形参为self,指代对象本身;
- 静态方法:是一个任意函数,在其上方使用@staticmethod”进行装饰,可以用对象直接调用, 静态方法实际上跟该类没有太大关系
2. Python中如何动态获取和设置对象的属性?
if hasattr(Parent,'x'): # hasattr(obj,"") 判断实例对象是否有指定实例属性或者实例方法、类方法、静方法、类属性
print(getattr(Parent,'x')) # getattr(obj,"") 从实例对象中获取指定实例属性或者实例方法、类方法、静方法、类属性
setattr(Parent,'x',3) # setattr(obj,"","") 为实例对象设置指定实例属性或者实例方法
print(getattr(Parent,'x'))
3. Python函数调用的时候参数的传递方式是值传递还是引用传递?
不可变类型的参数用值传递
可变类型的参数用引用传递
4. 为什么函数名字可以当做参数用?
Python中一切皆对象,函数名是函数在内存中的空间,也是一个对象。
5. 缺省(默认)参数和不定长参数、关键字参数的理解
def test(name="xiaoming"):
print(name)
test()
test("小红")
- 缺省参数指在调用函数的时候没有传入参数的情况下,调用参数设定的默认值,如果传入参数,会使用传入参数值
- *args 是不定长参数,他可以表示输入参数是不确定的,可以是任意多个。
- **kwargs 是关键字参数,赋值的时候是以键 = 值的方式,
def test1(*args,**kwargs): # 函数声明,表示该函数可以接收不定长的参数和关键字参数
test1(*args,**kwargs) # 拆包
6.Python中is和==的区别?
is 判断的是 a对象是否就是 b对象,是通过 id来判断的。
==判断的是 a对象的值是否和b对象的值相等,是通过 value 来判断的。
7. Python的魔法方法?
init 初始化方法,当一个实例被创建的时候初始化的方法
new 才是实例化对象调用的第一个方法
call 允许一个类的实例像函数一样被调用
getitem 定义获取容器中指定元素的行为,相当于 self[key]
getattr 定义当用户试图访问一个不存在属性的时候的行为
setattr 定义当一个属性被设置的时候的行为
getattribute 定义当一个属性被访问的时候的行为
del 定义当一个类的实例对象内存被销毁前的行为
8. 面向对象中怎么实现只读属性?
属性私有化
property
class Test(object):
def __init__(self):
self.__age = 18
def get_age(self):
return self.__age
@property
def age(self):
return self.__age
test = Test()
test.get_age()