提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
python的类和实例
一、子类和父类类型判别
A是B的父类时,如何进行继承后的类型判断?
class A:
pass
class B(A):#B作为子类继承A
pass
a,b = A(),B()
print(type(a),type(b),type(a) is type(b))#可见type只能查到本类的类型,并不能准确反映继承后的类关系
print(isinstance(b,(A,B)))#改用isinstance函数判断
print(isinstance(a,(B)))
二、类属性和实例属性
代码如下(示例):
class A():
k=114514
def __init__(self,x,y):
self.x = x
self.y = y
pass
a = A(1,2)
print(a.x,a.y,a.k,A.k)#一般情况下,实例和类都能访问到同一个类属性
a.k=123#这种直接访问修改的方式貌似合理,但是会被作为猴子补丁处理,就是为实例增加了一个新的k的实例属性
print(a.x,a.y,a.k,A.k)
三、静态方法和类方法。
两者均不需要绑定到实例上,也就是不需要一个实例化后的对象就可以调用。
静态方法用@staticmethod修饰,类方法用classmethod修饰,
因此静态方法无法直接访问类属性和实例属性,(当然,也可以在静态方法中通过类名访问到类属性)
类方法无法直接访问实例属性
class Circle:
shape = "circle"
def __init__(self,x,y):
self.x,self.y =x,y
pass
@classmethod
def show_shape(cls):
print(cls.shape)
@staticmethod
def func():
print("this is a staticmethod")
pass
c = Circle(3,4)
Circle.show_shape()
Circle.func()
四、私有化和限制访问
和C++这样的强类型语言一样,python也对类的属性进行了限制访问。
python类的私有属性以“__”来开头,在类的内部可以正常访问,但是在继承后和类外无法直接访问。
但是python的类私有化是伪私有化,可以通过_类名.__属性名来访问。
class MyClass:
def __init__(self):
self.__private_var = 10
def __private_method(self):
print("Private method")
def public_method(self):
print("Public method")
print(self.__private_var)
self.__private_method()
obj = MyClass()
obj.public_method()
# obj.__private_var # AttributeError: 'MyClass' object has no attribute '__private_var'
# obj.__private_method() # AttributeError: 'MyClass' object has no attribute '__private_method'
print(obj._MyClass__private_var) # 通过名称修正访问私有属性
obj._MyClass__private_method() # 通过名称修正调用私有方法
总结
下次见!