python-面向对象(1)
- 面向对象编程(oop)
- 基础
- 公有私有
- 继承
- 组合, Mixin
- 魔法函数
- 魔法函数概述
- 构造类魔法函数
- 运算类魔法函数
1. 面向对象概述(ObjectOriented,OO)
- 类和对象和概念
- 类:抽象名词,代表一个集合,共性的事物
- 对象:具象的事物,单个个体
- 类跟对象的关系
- 一个具象,代表一类事物的某一个个体
- 一个是抽象,代表的是一大类事物
- 类中的内容,应该具有两个内容
- 表明事物的特征,叫做属性(变量)
- 表明事物功能或动作, 称为成员方法(函数)
2. 类的基本实现
-
类的命名
- 遵守变量命名的规范
- 大驼峰(由一个或者多个单词构成,每个单词首字母大写,单词跟单词直接相连)
- 尽量避开跟系统命名相似的命名
-
如何声明一个类
- 必须用class关键字
- 类由属性和方法构成,其他不允许出现
- 成员属性定义可以直接使用变量赋值,如果没有值,则使用None
-
实例化类
变量 = 类名() #实例化了一个对象
-
访问对象成员
-
使用点操作符
obj.成员属性名称
obj.成员方法
-
-
可以通过默认特殊函数(魔法函数)来检查类和对象的所有成员
-
对象所有成员检查
dict前后各有两个下划线
obj.dict
-
类所有的成员
dict前后各有两个下划线
class_name.dict
-
案例
创建类
class Person():
# 类变量
name = 'chenpingan'
age = 18
# 方法
def say(self):
print('hello world')
# 实例化
p = Person()
p.say()
# 查看对象成员
print(p.dict)
print(Person.dict)
>>>
hello world
{}
{'module': 'main', 'name': 'chenpingan', 'age': 18, 'init': <function Person.init at 0x7f87ec138510>, 'say': <function Person.say at 0x7f87ec138400>,
'dict': <attribute 'dict' of 'Person' objects>, 'weakref': <attribute 'weakref' of 'Person' objects>, 'doc': None}
-
3. 类和对象的成员分析
- 类和对象都可以存储成员,成员可以归类所有,也可以归对象所有
- 类存储成员时使用的是与类关联的一个对象:即类对象
- 独享存储成员是是存储在当前对象中
- 对象访问一个成员时,如果对象中没有该成员,尝试访问类中的同名成员,如果对象中有此成员,一定使用对象中的成员
- 创建对象的时候,类中的成员不会放入对象当中,而是得到一个空对象,没有成员
- 通过对象对类中成员重新赋值或者通过对象添加成员时,对应成员会保存在对象中,而不会修改类成员
4. 关于self
-
self在对象的方法中表示当前对象本身,如果通过对象调用一个方法,那么该对象会自动传入到当前方法的第一个参数中
-
self并不是关键字,只是一个用于接受对象的普通参数,理论上可以用任何一个普通变量名代替
-
方法中有self形参的方法成为非绑定类的方法,可以通过对象访问, 没有self的是绑定类的方法,只能通过类访问
-
使用类访问绑定类的方法时, 如果类方法中需要访问当前类的成员,可以通过 class.成员名来访问
-
案例
创建类
class A():
name = "dana"
age = 18
# 注意say的写法,参数由一个self
def say(self):
self.name = "aaaa"
self.age = 200
# 此案例说明
# 类实例的属性和其对象的实例的属性在不对对象的实例属性赋值的前提下,
# 指向同一个变量
# 此时,A称为类实例
print(A.name)
print(A.age)
print("" * 20)
# id可以鉴别一个变量是否和另一个变量是同一变量
print(id(A.name))
print(id(A.age))
print("" * 20)
a = A()
# 查看A内所有的属性
print(A.dict)
print(a.dict)
a.name = "yaona"
a.age = 16
print(a.dict)
print(a.name)
print(a.age)
print(id(a.name))
print(id(a.age))
>>>
dana
18
********************
140666260313176
93936169025280
********************
{'module': 'main', 'name': 'dana', 'age': 18, 'say': <function A.say at 0x7fef6a799730>, 'dict': <attribute 'dict' of 'A' objects>, 'weakref': <attribute
'weakref' of 'A' objects>, 'doc': None}
{}
{'name': 'yaona', 'age': 16}
yaona
16
140666251554240
93936169025216 -
案例
class.属性
class Teacher():
name = "dana"
age = 19
def say(self):
self.name = "yaona"
self.age = 17
print("My name is {0}".format(self.name))
# 调用类的成员变量需要用 class
print("My age is {0}".format(class.age))
def sayAgain():
print(class.name)
print(class.age )
print("Hello, nice to see you again")
t = Teacher()
t.say()
# 调用绑定类函数使用类名
Teacher.sayAgain()
>>>
My name is yaona
My age is 19
dana
19
Hello, nice to see you again -
案例
关于self的案例
class A():
name = " liuying"
age = 18
def init(self):
self.name = "aaaa"
self.age = 200
def say(self):
print(self.name)
print(self.age)
class B():
name = "bbbb"
age = 90
a = A()
# 此时,系统会默认把a作为第一个参数传入函数
a.say()
# 此时,self被a替换
A.say(a)
# 同样可以把A作为参数传入
A.say(A)
# 此时,传入的是类实例B,因为B具有name和age属性,所以不会报错
A.say(B)
# 以上代码,利用了鸭子模型
>>>
aaaa
200
aaaa
200
liuying
18
bbbb
90

浙公网安备 33010602011771号