python类中方法和属性的分类概述

本文出自“阿敏其人”简书技术博客,转载请注明出处。
文/阿敏其人


一、类的创建

创建格式

class 类名:

    def 方法1(self, 参数列表):
        pass

.
来个例子

class Dog:
    """这是一个狗类"""

    def eat(self):
        print("吃香喝辣")

# 创建示例
d1 = Dog();

.
.

类的属性和方法 初探

在类里面可以直接定义 属性 和 方法,跟其他语言类似。

__dir__方法

在python里,我们可以通过 __dir__ 查看当前实例的所有的方法和属性。
(并不是所有的实例拥有的属性和方法都是一样多的,待会会谈到)

代码

class Phone:
    """一个简单的类实例"""
    phoneColor = "经典黑"

    def f(self):
        return 'hello'


# 实例化类
x = Phone()

# 访问类的属性和方法
print("Phone 类的属性 phoneColor 为:%s" % x.phoneColor)
print("Phone 类的方法 f 输出为: %s" % x.f())
print("Phone类的对象 x 所有的属性和方法: %s" % x.__dir__())

.
输出

Phone 类的属性 i 为:经典黑
Phone 类的方法 f 输出为: hello
Phone 所有的属性和方法: ['__module__', '__doc__', 'phoneColor', 'f', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']

Process finished with exit code 0

通过dir列出的内容,我们的Phone的实例有一个 phoneColor 的属性。

.
.

二、关于方法

类的所有方法几乎必带的 self 形参

  • 类的所有的方法都必须带有一个self的形参,但是调用时不需要传值(静态方法和类方法除外)。
  • self代表类的对象,不是类!由 哪一个对象 调用的方法,方法内的 self 就是 哪一个对象的引用,在类封装的方法内部,self 就表示 当前调用方法的对象自己。(类方法除外)
  • 调用方法时,不需要传递 self 参数
  • self 这个词不是指定的关键字,换成 abcd 什么的也行,只是叫做 self 含义较好。
class Test:
    def showAdd(self):
        print(self) # print(self)  可以打印出对象的地址
        print(self.__class__) # self.__class__ 可以指向真正类


t = Test()
t.showAdd()

.
输出

<__main__.Test object at 0x108d17e80>
<class '__main__.Test'>

self.class 可以指向真正类

.
.

init() 初始化方法

  • 类的初始化会调用 init() 的特殊方法(构造方法),开发时经常在定义类时重写该方法,做初始化操作。

代码

class Phone(object):
    """一个简单的类实例"""

    def __init__(self,brand,size):
        self.brand = brand
        self.size = size

# 实例化类
x = Phone("MI","5寸")

# 访问类的属性和方法
print("类对象 brand:%s" % x.brand)
print("类对象 size : %s" % x.size)
print("Phone类的对象对象 x 所有的属性和方法: %s" % x.__dir__())

.

类对象 brand:MI
类对象 size : 5寸
Phone 所有的属性和方法: ['brand', 'size', '__module__', '__doc__', '__init__', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']

Process finished with exit code 0

初始化演示完毕,需要注意的是:brand和size,是Phone类的对象的属性,不是Phone类的属性。

.
.

类的方法的分类: 公有方法、私有方法、静态方法和类方法

公有方法

公有方法:方法名前后都带有__,比如module
定义方式:def namemethod(self)
调用方式:对象名.公有方法


私有方法

私有方法私有方法:方法名只有前面带有__,比如 __testPrivate。

定义方式:def __namemethod(self)
调用方式:self._namemethod。注意:不能通过对象名直接调用。只能在属于对象的方法中通过self调用,或者在外部通过python的压缩规则进行调用。
(后文会结合私有属性,附上例子)


类方法

类方法
可以直接通过类名调用,也可以通过类的实例访问
静态方法和类方法都无法访问类实例属性,能通过类访问类属于类属性。
类方法,第一个参数必须要默认类,一般习惯用cls。类方法的形参 cls,代表类本身

定义方式
@classmethod
def methodname(cls)

常见场景
类方法用在模拟java定义多个构造函数的情况。


静态方法

静态方法

可以直接通过类名调用,也可以通过类的实例访问。
静态方法和类方法都无法访问类实例属性,能通过类访问类属于类属性。
静态方法对参数没有要求

定义方式
@staticmethod
def methodname()

调用方式:类名.方法名


常见场景
类中静态方法方法调用静态方法的情况。

静态方法和类方法的简单对比

1、两者都可以通过类对象或类名访问;静态方法和类方法都无法访问实例变量的,但可以通过类名访问类属性。
2、静态方法和类方法,可以减少 创建多实例时 所创造出来的内存空间,加快运行速度。

.
.
代码

class Phone(object):
    """一个简单的类实例"""

    age = 18

    def __init__(self,brand,size):
        self.brand = brand
        self.size = size

    def normalMethod(self):
        print("方法  normalMethod 被调用 %s" % self)

    def pubTest(self):
        print("公有方法  pubTest 被调用 %s" % self)

    def __pubTestOther__(self):
        print("公有方法  __pubTestOther__ 被调用 %s" % self)


    def __privateTest(self):
        print("私有方法  __privateTest 被调用 %s" % self)
        pass

    @staticmethod
    def staticTest(): # 静态方法不需要默认的 self 或者 cls 作为形参
        print("静态方法  staticTest 被调用")
        print(Phone.age) # 静态方法需要通过 类名.属性 来访问属性

    @classmethod
    def classTest(cls):
        print("类方法  classTest 被调用 %s" % cls)
        print("类方法  访问类的属性 %s" % Phone.age)


# 实例化类
x = Phone("MI","5寸")

print("Phone类的对象对象 x 所有的属性和方法: %s" % x.__dir__())

print("")
print("*"*10, "公有方法 开始", "*"*10)
x.pubTest()

print("*"*10, "公有方法 结束", "*"*10)

print("")
print("*"*10, "私有方法 开始", "*"*10)
print("私有方法无法直接通过 类对象 或者 类名 访问")
print("*"*10, "私有方法 结束", "*"*10)

print("")
print("*"*10, "静态方法 开始", "*"*10)
x.staticTest()
Phone.staticTest()
print("*"*10, "静态方法 结束", "*"*10)

print("")
print("*"*10, "类方法 开始", "*"*10)
x.classTest()
Phone.classTest()
print("*"*10, "类方法 结束", "*"*10)

.
.
打印:

Phone类的对象对象 x 所有的属性和方法: ['brand', 'size', '__module__', '__doc__', 'age', '__init__', 'normalMethod', 'pubTest', '__pubTestOther__', '_Phone__privateTest', 'staticTest', 'classTest', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']

********** 公有方法 开始 **********
公有方法  pubTest 被调用 <__main__.Phone object at 0x107aa02e8>
********** 公有方法 结束 **********

********** 私有方法 开始 **********
私有方法无法直接通过 类对象 或者 类名 访问
********** 私有方法 结束 **********

********** 静态方法 开始 **********
静态方法  staticTest 被调用
18
静态方法  staticTest 被调用
18
********** 静态方法 结束 **********

********** 类方法 开始 **********
类方法  classTest 被调用 <class '__main__.Phone'>
类方法  访问类的属性 18
类方法  classTest 被调用 <class '__main__.Phone'>
类方法  访问类的属性 18
********** 类方法 结束 **********

.
.

三、关于属性

1:实例属性:

最好在__init__(self,...)中初始化,内部调用时都需要加上self.

2:类属性:

__init__()外初始化
类的实例或者直接通过类名都可以访问

3:私有属性:

1、单下划线开头:告诉别人这是私有属性,但是外部依然可以访问更改
2、双下划线
_开头:外部不可访问。无论是类名还是类实例。

(python中没有绝对真正的私有属性)

.
.

实例属性示例代码

  • 一个类的对象可以通过点语法为当前类的对象添加一个属性,但这种方式添加的属性只属于这个属于对象,是实例属性属性。

代码

class Dog:
    """这是一个狗类"""

    def eat(self):
        print("吃香喝辣")


dog = Dog();


print(dog.__dir__())
dog.name = "大白"  
print(dog.__dir__())

# 通过 __dir__ 的打印对比,我们可以很明显地发现,dog.name = "大白"  执行过后,该对象多了一个 名为 name 的属性,这个属性只属于这个实例
print(dog.name)

dog2 = Dog() # dog2并没有 name 这个属性
print(dog2.__dir__())

.
输出

['__module__', '__doc__', 'eat', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']

['name', '__module__', '__doc__', 'eat', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']
大白
['__module__', '__doc__', 'eat', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']

Process finished with exit code 0

.
.

访问私有属性和私有方法 示例

代码

class PriTest(object):
    # 私有属性
    __priMem = "Jill"
    # 私有方法
    def __privateMethod(self):
        print("i ma a private metoid")


pt = PriTest()
# 利用python的压缩规则,我们依然可以调用到 私有方法。 但是不建议这么做。
#私有属性和方法的处理方式:在 名称 前面加上 _类名 => _类名__名称
pt._PriTest__privateMethod()
print(pt._PriTest__priMem)

.
输出

i ma a private metoid
Jill

Process finished with exit code 0

.
.
END.
谢谢阅读。

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,036评论 1 32
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,022评论 8 265
  • #脸红的思春期# 是今年四月份在韩国新出道的女声二重唱组合。由容易脸红的rapper兼吉他手禹智润和经常会有思春期...
    Cyanyyy阅读 1,234评论 6 5
  • 很早就想把自己拍下的花儿画下来,可是一直未能成行。最近终于拿起笔涂抹了一番,虽然依然稚嫩,起码我开始了前行的步伐!...
    叶听雨阅读 619评论 13 5
  • 这个故事的灵感来自于前些天翻看泸沽湖的一张旧照片,拍摄于一个叫做彼岸的临湖客栈,景色绝美。 故事中的主人公叶小麦,...
    曾经的卡卡阅读 271评论 0 0