(八) 学习笔记:python面向对象

在Python中使用class关键字来定义一个类,通常类是用来描述具有相同属性和方法的对象的集合。
面向对象的中重要的概念就是类和实例, 类是抽象的模板, 实例是根据类创建出来的一个一个具体的对象。
声明一个类模板

class Women:
    name = '张三'
    gender = '女'
    height = '168'
    def makeMoney(self):
        print('可以赚钱!')
    def cooking(self):
        print('做饭')

class后面紧跟的是类名(Women),类名通常是大写字母开头(也可以使用小写字母开头,保持良好的编程习惯请使用大写)
定义好类, 就可以根据类创建类的实例,例如:zs = Women()。创建类的实例是通过对象名=类名()实现的。
类的实例化

lisi = Woman()   # 将Women类实例化成对象
print(Woman)  # 打印类  <class '__main__.Women '>  
print(lisi)  #  打印类的实例化对象<__main__.Women object at 0x0..>

类的属性和方法的使用
类里面的变量也称之为属性, 类里面的函数也称之为方法。

lisi.属性名   # 调用属性
lisi.方法名()  # 调用方法

给类的实例绑定属性
可以很容易的给实例变量绑定一个新属性, 例如:给lisi绑定一个weight属性。

lisi.weight = '85斤'
print(lisi.weight)  # 85斤

对象属性和类属性

使用对象创建的属性称之为对象属性,对象属性只有当前对象里才存在。在Python中对象的属性包含对象的所有内容:方法和数据(方法也是对象的属性)
实例:

# 创建对象属性的方法
class A:
    pass
a = A()
a.name = 'xxx'   # 创建对象属性,一般通过 【对象名.属性名=xx】 创建
# 在方法里面创建的属性也为对象属性
class A:
    def createVal(self):
          self.name = 'xx'
a = A()
a.createVal()  # 调用方法,创建了对象属性

# 创建类属性的方法
A.name = 'xx'  # 通过【类名.属性名=xx】 创建类属性

注意:

  1. 如果使用对象属性创建了一个和类属性同名的属性,会优先使用对象使用。

  2. 使用类里的方法的参数self(后面会说)创建的属性也为对象属性。

  3. 在对象中使用对象名.属性名来修改类属性的时候,其实是创建了一个同名的对象属性。

  4. 当将对象里面同名的属性删除掉以后,还是会调用类的属性(当对象属性存在的时候找对象属性,对象属性不存在找类属性,类属性不存在报错)。

  5. 不能在对象里删除类属性(也不能修改, 见3), 只有使用的权利。

  6. 使用类操作过的属性(修改), 所有对象在调用类属性的时候,都是修改后的属性。

  7. 类属性属于类本身, 可以通过类名进行修改和删除。

类的常用的属性:

1. __doc__  类的说明
2. __name__ 返回类名
3. __base__ 返回一个父类
4. __bases__  返回多个父类(所有父类组成的元组)
5. __dict__ 以字典的形式返回对象或者类的信息(属性组成的字典)

方法

在python中有三种方法:实例方法,静态方法和类方法。
实例方法: 在每次定义实例方法的时候都必须指定实例(第一个参数, 名字一般为self)。例如:有一个对象zs = Women(), 该对象有一个实例方法makeMoney(self), 在调用的时候可以用zs.makeMoney()或者也可以使用Women.makeMoney(zs), 必须要给方法传递一个实例。
静态方法:不需要指定self参数, 可以使用类调用,也可以使用类的实例化对象来调用。之所以要使用此方法, 是因为有时候需要将一组逻辑相关的函数放在一个类里面。可以通过使用@staticmethod语法糖来声明为静态方法。
类方法: 在每次使用定义类方法的时候都必须指定一个类(第一个参数, 名字一般为cls),可以使用类名来调用,也可以使用实例对象来调用。可以通过使用@classmethod语法糖将方法声明为类方法。
实例:

class Women:
    def makeMoney(self):    # 普通方法
          pass
    @staticmethod
    def  sleep():   # 静态方法
         pass
    @classmethod
    def play(cls):  # 类方法
        pass

(1) 给对象绑定方法

使用from types import MethodType
实例:

from types import MethodType
class A:
    pass
def func(self):  # 类外的函数
    print('xxxxx')
a = A()
a.func = MethodType(func, a)  # 将方法绑定到类的对象
a.func()  # 调用方法

(2) 给类绑定方法

def func(self):
    print('func')
# 类名.属性名 = 函数名
A.func = func
A.func()  # 调用类方法

注意:
1.给对象绑定的属性或方法, 只有当前对象有。
2.给类绑定的属性或者方法,所有当前类的实例化对象都会拥有。

(3) self的说明

普通方法里面的self其实是代码当前类的实例化后的对象
self只是一个变量名,可以写成其他的名字, 但必须作为第一个参数, 养成良好的变成习惯请使用self。
实例:

class A:
    name = ""
    def demo(self):
        print(self) # <__main__.A object at ox...>
        print(id(self))  #  获取对象的内存地址 894654309712
a = A()
print(a)  # <__main__.a object at  ox...>
print(id(a))  #  894654309712

(4) return-方法的返回值

和函数一样, 代码遇到return 下面的代码就不在执行, 会将值返回给函数的调用处。
如果一个方法没有写return,该方法的返回值为None
实例:

class Demo:
    name = ''
    def speak(self):
        print('我是{}号类'.format(self.name))
    def myReturn(self):
        return self.name  
        # print(‘xx’)  # 将不再执行
d = Demo()
d.name = 'd1'
d.speak()  # 我是d1号类
print(d.speak())  # 返回None
dName = d.myReturn()
print(dName )  # 打印 d1

(5) 类的构造方法

在Python中, __init__()为类的构造方法, 用来初始化新创建对象的状态,在一个对象创建以后会立即调用。
实例

class Test(object):
    """
    用于初始化类
    """
    def __init__(self, a, b):   # 当实例化一个对象时候,会自动调用方法,对类进行初始化
        self.a = a
        self.b = b
    def speak(self):
        return (self.a, self.b)

t = Test(10, 20)
print(t.speak())  # 10, 20
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343