身份运算符
is
和is not
- 运算符
is
:a is b
判断两个对象是不是同一个对象(即内存地址是否相同),a is b
语句类似于id(a) == id(b)
- 运算符
is not
:同理,类似于id(a) != id(b)
is
和==
的区别
is
用于判断两个变量的对象是否为同一个,即判断对象内存地址的;==
用于判断两个变量引用的对象的值是否等;
私有属性和私有方法
在定义属性或者方法时,属性名或者方法名以两个下划线开始__
即表示该属性或者方法为私有
- 私有属性只能在对象内部被使用,不能再外部被访问修改,私有方法同理;
- 私有属性可以在对象方法中被访问;
- 下例中
__age
和__secret()
不能被外界直接访问,可用_Women__age
和_Women__secret()
方式进行访问,即(_ClassName__propertiename
和_ClassName__methodname()
);
class Women():
def __init__(self, name):
self.name = name
self.__age = 18
def __secret(self):
print("%s age is %d" % (self.name, self.__age))
单继承
继承概念:子类拥有父类的所有属性和方法,同时子类可以添加自有的特殊属性和方法
继承语法:class 子类(父类):
子类中方法重写:
- 对父类方法进行覆盖:子类可以继承父类的所有属性和方法,但当父类中封装的方法不适合子类时,可以在子类中针对父类中的同名方法进行重写,子类中重写的方法将覆盖父类方法;
- 对父类方法进行扩展:
class subclass(Parent):
def method(self): #首先,要在子类中重写父类Parent中同名方法
...
super().method() #其次,使用super()对象继承父类的方法
... #最后,在子类的重写方法中编写特殊扩展功能
1. 只有方法的父类继承:
class 子类名(父类名):
def subclass_method(self):
pass
2. 属性继承与扩展(即继承__init__()方法):
- 如果完全继承父类属性只需添加子类特有方法即可;
- 如果需要在父类基础上扩展子类属性,则采用:
class Parent():
def __init__(self, properties):
...
class Subclass(Parent):
def __init__(self, properties, specialproprty):
super().__init__(properties) #继承属性本质上就是扩展父类__init__()方法
...
多继承
多继承可以让子类同时具有多个父类的属性和方法
语法:class 子类(父类1, 父类2, ... ,父类n):
示例代码:
class A():
def test(self):
print("test method")
class B():
def demo():
print("demo method")
class C(A, B): #C类继承自A和B类
pass
c = C()
c.test() #C类创建的对象可以调用A类的方法
c.demo() #C类创建的对象也可以调用B类的方法
多继承注意事项:
如果不同的父类中中存在相同的方法,子类调用该方法是时调用哪一个父类中的该方法?__mro__方法可以显示方法搜索顺序。
显示打印类中方法的搜索顺序:
调用__mro__方法:print(ClassName.__mro__)
call方法
__call__
方法:
class School(object):
def __init__(self, name):
self.name = name
def __call__(self):
print("执行call方法")
s = School('BJ School')
s() # 实例名的后加括号,则会执行call方法代码块里的语句