【Python】类的基本使用
用于设置对象的私有数据 ( 属性 ) / 行为 ( 方法 ) ,使其不能被修改。
在定义类时,在 数据 ( 属性 ) / 行为 ( 方法 ) 前面加两个下划线,表示对该 属性 / 方法 进行隐藏,只有类的内部成员可以直接调用,一般情况下外部无法访问在定义类时,这种 __ 数据名 会被转化为 _ 类名 __ 数据名,所以在类的外面,我们还是可以通过 对象名 . _ 类名 __ 数据名 的形式强行访问私有数据,但是一般不推荐这样使用 class Dog(): def __init__(self, DogName): self.__name = DogName # 定义私有数据 def set_name(self, name): self.__name = name def __get_name(self): # 定义私有函数 return self.__name def get_fun(self): return self.__get_name() dog1 = Dog('中华田园犬') print(dog1.get_fun()) dog1.set_name('二哈') print(dog1.get_fun()) print(f'强行调用私有函数输出{dog1._Dog__get_name()}') # 不推荐强行调用 print(f'强行调用私有数据输出{dog1._Dog__name}') # ---------- 输出 ---------- # 中华田园犬 # 二哈 # 强行调用私有函数输出二哈 # 强行调用私有数据输出二哈 一般我们会在数据名前加一个下划线,来表示这是一个私有数据。就是说它其实还是一般的数据,只是我们以这种方式来告诉别人这是私有数据,不希望被修改。让我们能以调用数据的方式调用行为函数。方便我们后续的操作。
一般用于查询私有数据。我们可以在类的函数前使用 @property ,property装饰器会将行为 ( 方法 ) 转换为同名的数据 ( 属性 ) 。这样我们就可以用访问数据 ( 属性 ) 的形式调用行为 ( 方法 ) 。
class Dog(): def __init__(self, dogName): self.__name = dogName @property def name(self): print('执行property后面的函数', end=' ') return self.__name dog1 = Dog('little_black') print(dog1.name) # ---------- 输出 ---------- # 执行property后面的函数 little_black一般用于修改 @property 修饰的函数的值。在进行修改操作的函数前面添加 @函数名 . setter 装饰器,该函数就会转化为同名属性,对该属性进行赋值,就是修改 @property 后面的函数的值。
装饰器修饰的函数名建议保持一致 class Dog(): def __init__(self, dogName): self.__name = dogName @property def name(self): print('执行property后面的函数', end=' ') return self.__name @name.setter def name(self, newName): print('执行setter后面的函数') self.__name = newName dog1 = Dog('little_black') print(dog1.name) dog1.name = 'big_dog' print(dog1.name) # ---------- 输出 ---------- # 执行property后面的函数 little_black # 执行setter后面的函数 # 执行property后面的函数 big_dog一般用于删除 @property 后面的函数的值。在进行删除操作的函数前面添加 @函数名 . deleter 装饰器,该函数就会转化为同名属性,对该属性进行删除操作,就是删除 @property 后面的函数的值。
装饰器修饰的函数名建议保持一致 class Dog(): def __init__(self, dogName): self.__name = dogName @property def name(self): print('执行property后面的函数', end=' ') return self.__name @name.deleter def name(self): print('执行deleter后面的函数') del self.__name dog1 = Dog('little_black') print(dog1.name) del dog1.name # ---------- 输出 ---------- # 执行property后面的函数 little_black # 执行deleter后面的函数用于判断 class1 是否是 class2 的子类;若是则返回 True,否则返回 False
所有类的父类都是 object class Animals(object): pass class Dog(Animals): pass print(issubclass(Dog, Animals), end=' ') print(issubclass(Animals, object)) print(issubclass(type, object), end=' ') print(issubclass(int, object)) # ---------- 输出 ---------- # True True # True True会返回该类的所有父类
class Father(object): pass class Son(Father): pass print(Son.__bases__) # ---------- 输出 ---------- # (<class '__main__.Father'>,)等价于以下写法,但是这种写法会导致父类被调用多次,而 super ( ) 可以减少这样的开销。
class Grandfather(object): def __init__(self): print('enter Grandfather') print('leave Grandfather') class Father(Grandfather): def __init__(self): print('enter Father') # 等价于super(Father, self).__init__() Grandfather.__init__(self) print('leave Father') class Mother(Grandfather): def __init__(self): print('enter Mother') # 等价于super(Mother, self).__init__() Grandfather.__init__(self) print('leave Mother') class Son(Father, Mother): def __init__(self): print('enter Son') Father.__init__(self) Mother.__init__(self) # 等价于super(Son, self).__init__() print('leave Son') boy = Son() # ---------- 输出 ---------- # enter Son # enter Father # enter Grandfather # leave Grandfather # leave Father # enter Mother # enter Grandfather # leave Grandfather # leave Mother # leave Son具有不同功能的函数,可以使用相同的函数名;这样就可以用一个函数名,调用不同功能的函数。