面向对象编程基础-Python类(二)

1

对象既包含数据(变量,更习惯称之为特性,attribute),也包含代码(函数,也称为方法)。它是某一类具体事物的特殊实例

2

>>>class Person():
           def __init__(self):
           pass

__init__self就是实际Python类的定义形式.__init__()是Python中一个特殊的函数名,用于根据类的定义创建实例对象。self参数指向了这个正在被创建的对象本身

3

>>>class Person():
           def __init__(self,name):
                     self.name = name
>>>

现在,用Person类创建一个对象,为name特性传递一个字符串参数:

hunter = Person('Elmer Fudd')

上面这短短的一行代码实际做了以下工作:

  • 查看Person类的定义
  • 在内存中实例化(创建)一个新的对象
  • 调用对象的__init__方法,将这个新创建的对象作为self传入,并将另一个参数('Elmer Fudd')作为name传入
  • name的值存入对象
  • 返回这个新的对象
  • 将名字hunter与这个对象关联

这个新对象与任何其他的对象一样,你可以把它当作列表,元组,字典或集合中的元素。也可以把它当作参数传递给函数,或者把它做为函数的返回结果。

刚刚传入的name参数此时又在哪儿呢?它作为对象的特性存储在了对象里,可以直接对它进行读写操作:

>>>print('The mighty hunter:',hunter.name)
The mighty hunter:Elmer Fudd

4

>>>class Car():
             def exclaim(self):
                   print('I'm a car!')
>>>car = Car()
>>>car.exclaim()
I'm a car!

上面的语句,Python在背后做了一下两件事情:

  • 查找car对象所属的类(Car):
  • car对象作为self参数传给Car类所包含的exclaim()方法
    了解了调用机制后,甚至可以像下面这样进行调用,这与普通的调用语法(car.exclaim())效果完全一致。
>>>Car.exclaim(car)
I'm a Car!

当然,我们没有理由使用这种臃肿的语法

5

在类的定义中,以self作为第一个参数的方法都是实例方法(instance method)

6 (Python编程入门到实践)例子

class Dog():
         def __init__(self,name,age):
         """初始化属性name和age"""
                   self.name = name
                   self.age = age

        def sit(self):
            print(self.name.title() + "it now sitting.")

        def roll_over(self):
            print(self.name.title() + "rolled over!")        
  • 类中的函数称为方法
  • Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法
  • 两个变量都有前缀self。以 self为前缀的变量都可供类中所有方法使用,我们还可以通过类中的任何实例来访问这些变量。self.name=name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例。像这样可通过实例访问的变量称为属性

7

Python 使用self参数来找到正确的对象所包含的特性和方法

>>> class Person():
...     def __init__(self,name):
...             self.name = name
...     def age():
...             print('Age = 15')
...
>>> A = Person('Tom')
>>> A.name
'Tom'
>>> A.age()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: age() takes 0 positional arguments but 1 was given
>>> Person.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Person' has no attribute 'name'
>>> Person.age()
Age = 15
>>> class Person():
...     Age = 15
...     def name(self):
...             self.Name = 'Tom'
...
>>> A = Person()
>>> A.Age
15
>>> A.name()
>>> A.Name
'Tom'
>>> Person.Age
15
>>> Person.name()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: name() missing 1 required positional argument: 'self'
>>>

实例对象可以访问类的属性(特性),但不能访问类的方法

>>> class Dog():
...     def __init__(self):
...             self.name = 'Dan'
...             self.age = 8
...
>>> A = Dog()
>>> A.name
'Dan'
>>> A.age
8
>>> class woft():
...     self.name = 'tom'
...     self.age = 15
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in woft
NameError: name 'self' is not defined
>>>

实例的初始化必须用到__init__方法

>>> class Dog():
...     color = 'Black'
...     def __init__(self):
...             self.name = 'Dan'
...             self.age = 15
...
>>> A = Dog()
>>> A.Size='Big'
>>> Dog.Sound='wow'
>>> A.name
'Dan'
>>> A.age
15
>>> A.Size
'Big'
>>> A.Sound
'wow'
>>> A.color
'Black'
>>> Dog.color
'Black'
>>> Dog.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Dog' has no attribute 'name'
>>> Dog.Sound
'wow'
>>> Dog.age
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Dog' has no attribute 'age'
>>> Dog.Size
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Dog' has no attribute 'Size'
>>>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,069评论 4 358
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,212评论 1 287
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 105,912评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,424评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,741评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,194评论 1 206
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,553评论 2 307
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,289评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,923评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,251评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,775评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,144评论 2 249
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,698评论 3 228
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,936评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,658评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,214评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,159评论 2 258

推荐阅读更多精彩内容