【python】学习面向对象编程(二)

注意点

  • 对象的__dict__是可以赋值修改的,但类的__dict__不能修改,是只读的
    对象和类的__dict__有各自的存储空间

  • 类的属性可以被各个对象共享

上一节的补充点:

  • 可以通过__slots__限定对象可添加的属性
class Person:
  __slots__=['age']
  pass

p=Person()
p.age=1 #可以
p.num=2 #报错

方法相关的知识点

方法的概念和作用

  • 封装一系列的行为和动作
  • 和函数很类似,但是有所区别:调用方式
  • 调用方式:p.eat()
    要调用对象

方法的划分

  • 方法的第一个参数必须是要接收的数据类型
  • 实例方法:需要传入实例;self
  • 类方法:需要传入类;cls
  • 静态方法:没有限制
class Person:
  def eat2(self):
    print('this is实例方法')

  @classmethod
  def leifangfa(cls):
    print('this is类方法')

  @staticmethod
  def jingtaifangfa():
    print('this is 静态方法')
#调用:
p=Person()
p.eat2()
Person.leifangfa()
Person.jingtaifangfa()

方法的存储

  • 方法都存储类的__dict__里面,不存储在对象里面

实例方法

class Person:
  def eat(self,food): 
  print('eating',food)

p=Peason()
p.eat('potato')
  • 标准调用:利用实例(即对象)去调用,不需要自己传递第一个参数self
  • 其他调用(基本不用):1使用类调用2间接调用

类方法

class Person:
  @classmethod
  def leifangfa(cls,a):
    print('这是一个类方法',cls,a)

Person.leifangfa(123)
#这是一个类方法 <class '__main__.Person> 123

p=Person()
p.leifangfa(666)
#这是一个类方法 <class '__main__.Person> 666
#这告诉我们:可以用实例调用类方法,但是实例会被忽略

func=Person.leifangfa
func(111)
#这是一个类方法 <class '__main__.Person> 111
#装饰器的作用:保证这个函数原本不改变的情况下,给这个函数增加一些功能

class A(Person):
  pass
A.leifangfa(0)
#这是一个类方法 <class '__main__.Person> 0

静态方法

class Person:
  @staticmethod
  def jingtai():
    print('这是一个静态方法')

Person.jingtai()
#这是一个静态方法
p=Person()
p.jingtai()
#这是一个静态方法
func=Person.jingtai
func()
#这是一个静态方法

  • 可以通过类调用,也可以用实例调用

补充内容

1、访问权限问题

  • 在实例方法里面可以找到类属性、实例属性
  • 在类方法里面只可以找到类属性,不能找到实例属性
  • 在静态方法里面不能找到类属性也不能找到实例属性
    但是可以通过索引类去获取
  • cls表示默认传入的是类,self表示默认传入实例

2、类的补充内容

元类

  • 创建类对象的类
  • 元类可以创建新的类
  • 对象10的类是int,int的类是type
    对象"abc"的类是str,str的类是type
    type就是元类

用元类创建类对象

#type(类名,tuple,dict)
def run:
  print("run")
xxx=type("Dog",(),{"count":0,"run":run})
# 得到一个叫xxx的类
# 它有类属性count=0,类方法run
p=xxx()
p.run()
#run
print(p.count) #0

类的描述

  • 类本身的功能、类属性、类方法等
  • 写在前面用"""引起来

类的描述的获取

  • 1.用help(Person)获得所有的描述
  • 2.使用内置模块pydoc

类的属性分类

  • 保证数据安全性
  • 通过下划线完成伪私有效果
  • 公有属性
    _保护属性
    __私有属性

1.公有属性

class Animal:
  x=10
  def test(self):
    print(Animal.x)
    print(self.x)
  pass

class Dog(Animal):
  def test2(self):
    print(Dog.x)
    print(self.x)
  pass

#测试代码
a=Animal()
a.test()
#可以得到10,即在类的内部可以访问到这个公有属性
d=Dog()
d.test2()
#可以得到10,即在类的外部可以访问到这个公有属性

print(Animal.x)
print(Dog.x)
print(a.x)
print(d.x)
#这样也都可以访问到x
  • 跨模块访问公有属性
# file1.py
a=666
# file2.py
import file1
print(file1.a) #666
# file3.py
from file1 import *
print(a) #666

以上3段代码告诉我们:可以直接访问到a

2.受保护的属性

class Animal:
  _x=10
  def test(self):
    print(Animal._x)
    print(self._x)
  pass

class Dog(Animal):
  def test2(self):
    print(Dog._x)
    print(self._x)
  pass

#测试代码
a=Animal()
a.test()
#可以得到10,即在类的内部可以访问到这个受保护的属性

d=Dog()
d.test2()
#可以得到10,即在类的外部可以访问到这个受保护的属性

print(Animal._x)
print(Dog._x)
print(a._x)
print(d._x)
#这样也都可以访问到x,但是会有警报(黄色波浪线)
  • 可以访问,但是会有警报,建议不要访问

  • what about跨模块访问受保护的属性?

# file1.py
_a=666
# file2.py
import file1
print(file1._a) #666
#可以访问但是有警报
# file3.py
from file1 import *
print(_a) 
# 无法访问 直接报错
  • 只可以用import的形式访问,不可以from...import...
  • 但是如果file1里加入以下代码的话就可以正常访问这个受保护的属性
__all__=['_a']

3.私有属性

class Animal:
  __x=10
  def test(self):
    print(Animal.__x)
    print(self.__x)
  pass

class Dog(Animal):
  def test2(self):
    print(Dog.__x)
    print(self.__x)
  pass

#测试代码
a=Animal()
a.test()
#可以得到10,即在类的内部可以访问到这个私有属性

d=Dog()
d.test2()
#报错,不可以得到10,即在类的外部不可以访问到这个私有属性

print(Animal.__x)
print(Dog.__x)
print(a.__x)
print(d.__x)
#4条都会报错,在外部不可以访问私有属性
  • 结论:私有属性在本模块的其他位置都不可以访问,不管通过类、子类、类或子类的实例,都不可以访问到。

  • 只可以在类的内部访问到。

  • 可以访问,但是会有警报,建议不要访问

  • what about跨模块访问?
    ——情况和一个下划线的一致。

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

推荐阅读更多精彩内容