一、基础知识
-
self
同一个类可以生成无数个对象,当一个对象的方法被调用时,对象会将自身的引用作为第一个参数传给该方法,python便知道需要操作谁如果将类比作图纸,那么由类实例化后的对象为可以住的房子。根据一张图纸可以设计出成千上万的房子,但是每个房子都有自己的主人。这里的self 就相当于每个房子的门牌号,有了 self 就可以轻松知道自己的房子。
class Ball:
def setName(self, name):
self.name = name
def kick(self):
print('我叫 %s ,少林足球传承人' % self.name)
a = Ball()
a.setName('飞轮镖')
b = Ball()
b.setName('回旋镖')
a.kick() #返回结果:我叫 飞轮镖 ,少林足球传承人
b.kick() #返回结果:我叫 回旋镖 ,少林足球传承人
- “ _ _init _ _( )”
__ init __()
是Python里面的构造方法,只要实例化一个对象,这个方法就会在对象被创建时自动调用
class Potato:
def __init__(self, name):
self.name = name
def kick(self):
print("我叫 %s ,蔬菜里的大头" % self.name)
p = Potato('土豆')
- 1
- 2
- 3
- 4
- 5
- 6
-
公有和私有
对于Python,默认上对象的属性和方法都是公开的,可以直接通过操作符(.)进行访问
class Person:
name = '小明'
p = Person()
p.name
- 1
- 2
- 3
- 4
为了实现类似私有变量的特征,Python内容采用了一种叫name mangling(名字改编)的技术, 在python中定义私有变量只需要在变量名或者函数名前加"__"
两个下划线
class Person:
__name = "test"
p = Person()
p.__name
#返回结果:
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'Person' object has no attribute '__name'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
此时要想实现访问只能从内部进行访问
class Person:
def __init__(self, name):
self.__name = name
def getName(self):
return self.__name
p = Person('小明')
p.getName() #返回结果:小明
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
python目前的私有机制都是伪机制,在外部可以通过“_类名__变量名”既可以访问双下横线开头的私有变量
p._Person__name
- 1
二、补充
关于面向设计,当考虑需要什么类以及类要有什么方法时,可以尝试下面的方法:
(1)写下问题的描述(程序要做什么),把所有名词、动词和形容词加下划线
(2)对于所有名词,用作可能的类
(3)对于所有动词,用作可能的方法
(4)对于所有形容词,用作可能的特性
(5)把所有方法和特性分配到类