Python 中方法没有重载
私有属性和私有方法(实现封装)
Python 对于类的成员没有严格的访问控制限制,这与其他面向对象语言有区别。关于私有属性和私有方法,有如下要点:
- 通常约定,两个下划线开头的属性是私有的(private)。其他为公共的(public)。
- 类内部可以访问私有属性(方法)
- 类外部不能直接访问私有属性(方法)
- 类外部可以通过“_类名__私有属性(方法)名”访问私有属性(方法)
私有属性和公有属性
class Employee: __company = "百战程序员"
_Employee__company
def __init__(self,name,age):
self.name = name
self.__age = age
def say_company(self):
print("我的公司是:",Employee.__company)
可以直接访问私有属性
print(self.name,"的年龄是:",self.__age)
self.__work()
def __work(self):
_Employee__work
print("工作!好好工作,好好赚钱,娶个媳妇!")
p1 = Employee("高淇",32)
print(p1.name)
print(dir(p1))
p1.say_company()
print(p1._Employee__age)
性 。通过 dir 可以查到属性:_Employee__age
@property 装饰器
@property 可以将一个方法的调用方式变成“属性调用”
属性和方法命名总结
· _xxx:保护成员,不能用“from module import * ”导入,只有类对象和子类对象能访问这些成员。 · xxx:系统定义的特殊成员 · __xxx: 类中的私有成员,只有类对象自己能访问,子类对象也不能访问。(但,在类外部可以通过“对象名. _类名__xxx”这种特殊方式访问。Python 不存在严格意义的私有成员)
类编码风格
- 类名首字母大写,多个单词之间采用驼峰原则。
- 实例名、模块名采用小写,多个单词之间采用下划线隔开。
- 每个类,应紧跟“文档字符串”,说明这个类的作用。
- 可以用空行组织代码,但不能滥用。在类中,使用一个空行隔开方法;模块中,使用两个空行隔开多个类
封装
隐藏对象的属性和实现细节,只对外提供必要的方法。相当于将“细节封装起来”,只对外暴露“相关调用方法”。
语法格式
Python 支持多重继承,一个子类可以继承多个父类。继承的语法格式如下: class 子类类名(父类 1[,父类 2,…]): 类体
class Person:
def __init__(self,name,age):
self.name = name
self.__age = age
def say_age(self):
print(self.name,"的年龄是:",self.__age)
class Student(Person):
def __init__(self,name,age,score):
self.score = score
Person.__init__(self,name,age)
s1 = Student("张三",15,85)
s1.say_age()
print(dir(s1))
类成员的继承和重写
- 成员继承:子类继承了父类除构造方法之外的所有成员。
- 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”
通过类的方法 mro()或者类的属性__mro__可以输出这个类的继承层次结构
object 有一个__str__()方法,用于返回一个对于“对象的描述”,对应于内置函数 str()经常用于 print()方法,帮助我们查看对象的信息。str()可以重写。
多重继承
Python 支持多重继承,一个子类可以有多个“直接父类”。 我们可以通过 mro()方法获得“类的层次结构”,方法解析顺序也是按照这个“类的层次结构”寻找的。
多态(polymorphism)
是指同一个方法调用由于对象不同可能会产生不同的行为
对象的浅拷贝和深拷贝
·变量的赋值操作只是形成两个变量,实际还是指向同一个对象。 ·浅拷贝 Python 拷贝一般都是浅拷贝。拷贝时,对象包含的子对象内容不拷贝。因此,源对象和拷贝对象会引用同一个子对象。 ·深拷贝 使用 copy 模块的 deepcopy 函数,递归拷贝对象中包含的子对象。源对象和拷贝对象所有的子对象也不同
组合
“is-a”关系,我们可以使用“继承”。从而实现子类拥有的父类的方法和属性。 “is-a”关系指的是类似这样的关系:狗是动物,dog is animal。狗类就应该继承动物类。 “has-a”关系,我们可以使用“组合”,也能实现一个类拥有另一个类的方法和属性。”has-a”关系指的是这样的关系:手机拥有 CPU。 MobilePhone has a CPU。
|