1. 对象 = 属性 + 方法

对象是类的实例。换句话说,类主要定义对象的结构,然后我们以类为模板创建对象。类不但包含方法定义,而且还包含所有实例共享的数据。

封装:信息隐蔽技术

我们可以使用关键字 class 定义 Python 类,关键字后面紧跟类的名称、分号和类的实现。

【例子】

class Turtle: # Python中的类名约定以大写字母开头

"""关于类的一个简单例子"""

# 属性

color = 'green'

weight = 10

legs = 4

shell = True

mouth = '大嘴'

# 方法

def climb(self):

print('我正在很努力的向前爬...')

def run(self):

print('我正在飞快的向前跑...')

def bite(self):

print('咬死你咬死你!!')

def eat(self):

print('有得吃,真满足...')

def sleep(self):

print('困了,睡了,晚安,zzz')

tt = Turtle()

print(tt)

# <__main__.Turtle object at 0x0000007C32D67F98>

print(type(tt))

#

print(tt.__class__)

#

print(tt.__class__.__name__)

# Turtle

tt.climb()

# 我正在很努力的向前爬...

tt.run()

# 我正在飞快的向前跑...

tt.bite()

# 咬死你咬死你!!

# Python类也是对象。它们是type的实例

print(type(Turtle))

#

继承:子类自动共享父类之间数据和方法的机制

【例子】

class MyList(list):

pass

lst = MyList([1, 5, 2, 7, 8])

lst.append(9)

lst.sort()

print(lst)

# [1, 2, 5, 7, 8, 9]

多态:不同对象对同一方法响应不同的行动

【例子】

class Animal:

def run(self):

raise AttributeError('子类必须实现这个方法')

class People(Animal):

def run(self):

print('人正在走')

class Pig(Animal):

def run(self):

print('pig is walking')

class Dog(Animal):

def run(self):

print('dog is running')

def func(animal):

animal.run()

func(Pig())

# pig is walking

2. self 是什么?

Python 的 self 相当于 C++ 的 this 指针。

【例子】

class Test:

def prt(self):

print(self)

print(self.__class__)

t = Test()

t.prt()

# <__main__.Test object at 0x000000BC5A351208>

#

类的方法与普通的函数只有一个特别的区别 —— 它们必须有一个额外的第一个参数名称(对应于该实例,即该对象本身),按照惯例它的名称是 self。在调用方法时,我们无需明确提供与参数 self 相对应的参数。

【例子】

class Ball:

def setName(self, name):

self.name = name

def kick(self):

print("我叫%s,该死的,谁踢我..." % self.name)

a = Ball()

a.setName("球A")

b = Ball()

b.setName("球B")

c = Ball()

c.setName("球C")

a.kick()

# 我叫球A,该死的,谁踢我...

b.kick()

# 我叫球B,该死的,谁踢我...

3. Python 的魔法方法

据说,Python 的对象天生拥有一些神奇的方法,它们是面向对象的 Python 的一切...

它们是可以给你的类增加魔力的特殊方法...

如果你的对象实现了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,而这一切都是自动发生的...

类有一个名为__init__(self[, param1, param2...])的魔法方法,该方法在类实例化时会自动调用。

【例子】

class Ball:

def __init__(self, name):

self.name = name

def kick(self):

print("我叫%s,该死的,谁踢我..." % self.name)

a = Ball("球A")

b = Ball("球B")

c = Ball("球C")

a.kick()

# 我叫球A,该死的,谁踢我...

b.kick()

# 我叫球B,该死的,谁踢我...

4. 公有和私有

在 Python 中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会为私有的了。

【例子】类的私有属性实例

class JustCounter:

__secretCount = 0 # 私有变量

publicCount = 0 # 公开变量

def count(self):

self.__secretCount += 1

self.publicCount += 1

print(self.__secretCount)

counter = JustCounter()

counter.count() # 1

counter.count() # 2

print(counter.publicCount) # 2

print(counter._JustCounter__secretCount) # 2 Python的私有为伪私有

print(counter.__secretCount)

# AttributeError: 'JustCounter' object has no attribute '__secretCount'

【例子】类的私有方法实例

class Site:

def __init__(self, name, url):

self.name = name # public

self.__url = url # private

def who(self):

print('name : ', self.name)

print('url : ', self.__url)

def __foo(self): # 私有方法

print('这是私有方法')

def foo(self): # 公共方法

print('这是公共方法')

self.__foo()

x = Site('老马的程序人生', 'https://blog.csdn.net/LSGO_MYP')

x.who()

# name : 老马的程序人生

# url : https://blog.csdn.net/LSGO_MYP

x.foo()

# 这是公共方法

# 这是私有方法

x.__foo()

# AttributeError: 'Site' object has no attribute '__foo'

5. 继承

Python 同样支持类的继承,派生类的定义如下所示:

class DerivedClassName(BaseClassName):

.

.

.

BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:

class DerivedClassName(modname.BaseClassName):

.

.

.

【例子】如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。

# 类定义

class people:

# 定义基本属性

name = ''

age = 0

# 定义私有属性,私有属性在类外部无法直接进行访问

__weight = 0

# 定义构造方法

def __init__(self, n, a, w):

self.name = n

self.age = a

self.__weight = w

def speak(self):

print("%s 说: 我 %d 岁。" % (self.name, self.age))

# 单继承示例

class student(people):

grade = ''

def __init__(self, n, a, w, g):

# 调用父类的构函

people.__init__(self, n, a, w)

self.grade = g

# 覆写父类的方法

def speak(self):

print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade))

s = student('小马的程序人生', 10, 60, 3)

s.speak()

# 小马的程序人生 说: 我 10 岁了,我在读 3 年级

注意:如果上面的程序去掉:people.__init__(self, n, a, w),则输出:说: 我 0 岁了,我在读 3 年级,因为子类的构造方法把父类的构造方法覆盖了。

【例子】

import random

class Fish:

def __init__(self):

self.x = random.randint(0, 10)

self.y = random.randint(0, 10)

def move(self):

self.x -= 1

print("我的位置", self.x, self.y)

class GoldFish(Fish): # 金鱼

pass

class Carp(Fish): # 鲤鱼

pass

class Salmon(Fish): # 三文鱼

pass

class Shark(Fish): # 鲨鱼

def __init__(self):

self.hungry = True

def eat(self):

if self.hungry:

print("吃货的梦想就是天天有得吃!")

self.hungry = False

else:

print("太撑了,吃不下了!")

self.hungry = True

g = GoldFish()

g.move() # 我的位置 9 4

s = Shark()

s.eat() # 吃货的梦想就是天天有得吃!

s.move()

# AttributeError: 'Shark' object has no attribute 'x'

解决该问题可用以下两种方式:

调用未绑定的父类方法Fish.__init__(self)

class Shark(Fish): # 鲨鱼

def __init__(self):

Fish.__init__(self)

self.hungry = True

def eat(self):

if self.hungry:

print("吃货的梦想就是天天有得吃!")

self.hungry = False

else:

print("太撑了,吃不下了!")

self.hungry = True

使用super函数super().__init__()

class Shark(Fish): # 鲨鱼

def __init__(self):

super().__init__()

self.hungry = True

def eat(self):

if self.hungry:

print("吃货的梦想就是天天有得吃!")

self.hungry = False

else:

print("太撑了,吃不下了!")

self.hungry = True

Python 虽然支持多继承的形式,但我们一般不使用多继承,因为容易引起混乱。

class DerivedClassName(Base1, Base2, Base3):

.

.

.

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,Python 从左至右搜索,即方法在子类中未找到时,从左到右查找父类中是否包含方法。

【例子】

# 类定义

class People:

# 定义基本属性

name = ''

age = 0

# 定义私有属性,私有属性在类外部无法直接进行访问

__weight = 0

# 定义构造方法

def __init__(self, n, a, w):

self.name = n

self.age = a

self.__weight = w

def speak(self):

print("%s 说: 我 %d 岁。" % (self.name, self.age))

# 单继承示例

class Student(People):

grade = ''

def __init__(self, n, a, w, g):

# 调用父类的构函

People.__init__(self, n, a, w)

self.grade = g

# 覆写父类的方法

def speak(self):

print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade))

# 另一个类,多重继承之前的准备

class Speaker:

topic = ''

name = ''

def __init__(self, n, t):

self.name = n

self.topic = t

def speak(self):

print("我叫 %s,我是一个演说家,我演讲的主题是 %s" % (self.name, self.topic))

# 多重继承

class Sample01(Speaker, Student):

a = ''

def __init__(self, n, a, w, g, t):

Student.__init__(self, n, a, w, g)

Speaker.__init__(self, n, t)

# 方法名同,默认调用的是在括号中排前地父类的方法

test = Sample01("Tim", 25, 80, 4, "Python")

test.speak()

# 我叫 Tim,我是一个演说家,我演讲的主题是 Python

class Sample02(Student, Speaker):

a = ''

def __init__(self, n, a, w, g, t):

Student.__init__(self, n, a, w, g)

Speaker.__init__(self, n, t)

# 方法名同,默认调用的是在括号中排前地父类的方法

test = Sample02("Tim", 25, 80, 4, "Python")

test.speak()

# Tim 说: 我 25 岁了,我在读 4 年级

6. 组合

【例子】

class Turtle:

def __init__(self, x):

self.num = x

class Fish:

def __init__(self, x):

self.num = x

class Pool:

def __init__(self, x, y):

self.turtle = Turtle(x)

self.fish = Fish(y)

def print_num(self):

print("水池里面有乌龟%s只,小鱼%s条" % (self.turtle.num, self.fish.num))

p = Pool(2, 3)

p.print_num()

# 水池里面有乌龟2只,小鱼3条

7. 类、类对象和实例对象

类对象:创建一个类,其实也是一个对象也在内存开辟了一块空间,称为类对象,类对象只有一个。

# 类对象

class A(object):

pass

实例对象:就是通过实例化类创建的对象,称为实例对象,实例对象可以有多个。

【例子】

# 实例化对象 a、b、c都属于实例对象。

a = A()

b = A()

c = A()

类属性:类里面方法外面定义的变量称为类属性。类属性所属于类对象并且多个实例对象之间共享同一个类属性,说白了就是类属性所有的通过该类实例化的对象都能共享。

【例子】

class A():

a = 0 # 类属性

def __init__(self, xx):

# 使用类属性可以通过 (类名.类属性)调用。

A.a = xx

实例属性:实例属性和具体的某个实例对象有关系,并且一个实例对象和另外一个实例对象是不共享属性的,说白了实例属性只能在自己的对象里面使用,其他的对象不能直接使用,因为self是谁调用,它的值就属于该对象。

【例子】

class 类名():

__init__(self):

self.name = xx #实例属性

类属性和实例属性区别

类属性:类外面,可以通过实例对象.类属性和类名.类属性进行调用。类里面,通过self.类属性和类名.类属性进行调用。

实例属性 :类外面,可以通过实例对象.实例属性调用。类里面,通过self.实例属性调用。

实例属性就相当于局部变量。出了这个类或者这个类的实例对象,就没有作用了。

类属性就相当于类里面的全局变量,可以和这个类的所有实例对象共享。

【例子】

# 创建类对象

class Test(object):

class_attr = 100 # 类属性

def __init__(self):

self.sl_attr = 100 # 实例属性

def func(self):

print('类对象.类属性的值:', Test.class_attr) # 调用类属性

print('self.类属性的值', self.class_attr) # 相当于把类属性 变成实例属性

print('self.实例属性的值', self.sl_attr) # 调用实例属性

a = Test()

a.func()

# 类对象.类属性的值: 100

# self.类属性的值 100

# self.实例属性的值 100

b = Test()

b.func()

# 类对象.类属性的值: 100

# self.类属性的值 100

# self.实例属性的值 100

a.class_attr = 200

a.sl_attr = 200

a.func()

# 类对象.类属性的值: 100

# self.类属性的值 200

# self.实例属性的值 200

b.func()

# 类对象.类属性的值: 100

# self.类属性的值 100

# self.实例属性的值 100

Test.class_attr = 300

a.func()

# 类对象.类属性的值: 300

# self.类属性的值 200

# self.实例属性的值 200

b.func()

# 类对象.类属性的值: 300

# self.类属性的值 300

# self.实例属性的值 100

注意:属性与方法名相同,属性会覆盖方法。

【例子】

class A:

def x(self):

print('x_man')

aa = A()

aa.x() # x_man

aa.x = 1

print(aa.x) # 1

aa.x()

# TypeError: 'int' object is not callable

8. 什么是绑定?

Python 严格要求方法需要有实例才能被调用,这种限制其实就是 Python 所谓的绑定概念。

Python 对象的数据属性通常存储在名为.__ dict__的字典中,我们可以直接访问__dict__,或利用 Python 的内置函数vars()获取.__ dict__。

【例子】

class CC:

def setXY(self, x, y):

self.x = x

self.y = y

def printXY(self):

print(self.x, self.y)

dd = CC()

print(dd.__dict__)

# {}

print(vars(dd))

# {}

print(CC.__dict__)

# {'__module__': '__main__', 'setXY': , 'printXY': , '__dict__': , '__weakref__': , '__doc__': None}

dd.setXY(4, 5)

print(dd.__dict__)

# {'x': 4, 'y': 5}

print(vars(CC))

# {'__module__': '__main__', 'setXY': , 'printXY': , '__dict__': , '__weakref__': , '__doc__': None}

print(CC.__dict__)

# {'__module__': '__main__', 'setXY': , 'printXY': , '__dict__': , '__weakref__': , '__doc__': None}

9. 一些相关的内置函数(BIF)

issubclass(class, classinfo) 方法用于判断参数 class 是否是类型参数 classinfo 的子类。

一个类被认为是其自身的子类。

classinfo可以是类对象的元组,只要class是其中任何一个候选类的子类,则返回True。

【例子】

class A:

pass

class B(A):

pass

print(issubclass(B, A)) # True

print(issubclass(B, B)) # True

print(issubclass(A, B)) # False

print(issubclass(B, object)) # True

isinstance(object, classinfo) 方法用于判断一个对象是否是一个已知的类型,类似type()。

type()不会认为子类是一种父类类型,不考虑继承关系。

isinstance()会认为子类是一种父类类型,考虑继承关系。

如果第一个参数不是对象,则永远返回False。

如果第二个参数不是类或者由类对象组成的元组,会抛出一个TypeError异常。

【例子】

a = 2

print(isinstance(a, int)) # True

print(isinstance(a, str)) # False

print(isinstance(a, (str, int, list))) # True

class A:

pass

class B(A):

pass

print(isinstance(A(), A)) # True

print(type(A()) == A) # True

print(isinstance(B(), A)) # True

print(type(B()) == A) # False

hasattr(object, name)用于判断对象是否包含对应的属性。

【例子】

class Coordinate:

x = 10

y = -5

z = 0

point1 = Coordinate()

print(hasattr(point1, 'x')) # True

print(hasattr(point1, 'y')) # True

print(hasattr(point1, 'z')) # True

print(hasattr(point1, 'no')) # False

getattr(object, name[, default])用于返回一个对象属性值。

【例子】

class A(object):

bar = 1

a = A()

print(getattr(a, 'bar')) # 1

print(getattr(a, 'bar2', 3)) # 3

print(getattr(a, 'bar2'))

# AttributeError: 'A' object has no attribute 'bar2'

【例子】这个例子很酷!

class A(object):

def set(self, a, b):

x = a

a = b

b = x

print(a, b)

a = A()

c = getattr(a, 'set')

c(a='1', b='2') # 2 1

setattr(object, name, value)对应函数 getattr(),用于设置属性值,该属性不一定是存在的。

【例子】

class A(object):

bar = 1

a = A()

print(getattr(a, 'bar')) # 1

setattr(a, 'bar', 5)

print(a.bar) # 5

setattr(a, "age", 28)

print(a.age) # 28

delattr(object, name)用于删除属性。

【例子】

class Coordinate:

x = 10

y = -5

z = 0

point1 = Coordinate()

print('x = ', point1.x) # x = 10

print('y = ', point1.y) # y = -5

print('z = ', point1.z) # z = 0

delattr(Coordinate, 'z')

print('--删除 z 属性后--') # --删除 z 属性后--

print('x = ', point1.x) # x = 10

print('y = ', point1.y) # y = -5

# 触发错误

print('z = ', point1.z)

# AttributeError: 'Coordinate' object has no attribute 'z'

class property([fget[, fset[, fdel[, doc]]]])用于在新式类中返回属性值。

fget -- 获取属性值的函数

fset -- 设置属性值的函数

fdel -- 删除属性值函数

doc -- 属性描述信息

【例子】

class C(object):

def __init__(self):

self.__x = None

def getx(self):

return self.__x

def setx(self, value):

self.__x = value

def delx(self):

del self.__x

x = property(getx, setx, delx, "I'm the 'x' property.")

cc = C()

cc.x = 2

print(cc.x) # 2

del cc.x

print(cc.x)

# AttributeError: 'C' object has no attribute '_C__x'

参考文献:

练习题:

1、以下类定义中哪些是类属性,哪些是实例属性?

class C:

num = 0

def __init__(self):

self.x = 4

self.y = 5

C.count = 6

2、怎么定义私有⽅法?

3、尝试执行以下代码,并解释错误原因:

class C:

def myFun():

print('Hello!')

c = C()

c.myFun()

4、按照以下要求定义一个游乐园门票的类,并尝试计算2个成人+1个小孩平日票价。

要求:

平日票价100元

周末票价为平日的120%

儿童票半价

class Ticket():

# your code here

python中的方法是什么_Python方法相关推荐

  1. python中def什么时候用_Python中定义函数def的使用方法

    Python中定义函数def的使用方法 发布时间:2020-12-15 09:26:24 来源:亿速云 阅读:71 作者:小新 这篇文章给大家分享的是有关Python中定义函数def的使用方法的内容. ...

  2. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

  3. Python中os和shutil模块实用方法集锦

    Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...

  4. python中的class怎么用_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  5. python中怎么输出中文-python中使用print输出中文的方法

    看Python简明教程,学习使用print打印字符串,试了下打印中文,不行. 编辑环境:IDLE 上网搜了下解决办法,各种说法,试了两种: print u"学习" print (u ...

  6. python if语句多个条件-Python中if有多个条件处理方法

    Python中if有多个条件怎么办 python中if有多个条件,可以使用and.or.elif关键字来连接. Python 编程中 if 语句用于控制程序的执行,基本形式为: if 判断条件: 执行 ...

  7. python写错了怎么更改-Python中修改字符串的四种方法

    在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...

  8. python自带的shell是什么-python中执行shell的两种方法总结

    一.使用python内置commands模块执行shell commands对Python的os.popen()进行了封装,使用SHELL命令字符串作为其参数,返回命令的结果数据以及命令执行的状态: ...

  9. python getattr调用自己模块_在Python中通过getattr获取对象引用的方法

    getattr函数 (1)使用 getattr 函数,可以得到一个直到运行时才知道名称的函数的引用. >>> li = ["Larry", "Curly ...

  10. python字符计数怎样去除空格_去除python中的字符串空格的简单方法

    python编程中,我们在修改代码,遇到空格很多的情况下,我们要删除空格.本文小编整理了三种字符串去除空格的方法: 方法一:使用字符串函数replace,去除全部空格. 实例: >>> ...

最新文章

  1. 拉格朗日乘子法 学习笔记
  2. mac mtu测试_一个关于MTU的现象,请兄弟们看看是不是确实是这样。 - 网络管理论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  3. 5G NPN 行业专网 — 部署模式
  4. EF中的那些批量操作
  5. php weize_docs.html
  6. 同步现象 心理学_男生是不是更容易从失恋中走出来?心理学:失恋后悲伤,男女不同...
  7. 2017-7-18-每日博客-关于Linux下的通配符.doc
  8. 使用HTML5中的Canves标签制作时钟特效
  9. 1次订单事故,扣了我3个月绩效!
  10. Liang-Barsky算法剪裁实例
  11. Windows10台式机前面板插孔声音和麦克风不可用
  12. 红孩儿编辑器的开发 1 字体库的生成过程
  13. 挪威是这样养三文鱼的--转帖
  14. 【题集】AVL树、伸展树、红黑树、二叉查找树、替罪羊树的时间复杂度
  15. 我在【MIT科技创新领袖俱乐部】的演讲实录
  16. 迁移学习 --- 终身学习
  17. 【分布式】关于分布式“一致性”的讨论
  18. Fastadmin 后台上传视频
  19. 【Java】创建文件夹
  20. Apollo入门课程04-感知

热门文章

  1. 基于面部表情的情绪识别-论文学习
  2. 你还在靠“喂喂喂”来测语音通话质量吗,看完这篇文章你就能掌握正确姿势。
  3. 卡巴斯基和Endtab.org开设新课程教授用户如何防范人肉搜索
  4. 银行测试的优势在哪里?
  5. 用c语言绘制五角星图形,用c语言画出一个五角星图案
  6. source insight的查找功能
  7. 如何批量查询快递的签收状态?
  8. Jupyter Notebook切换conda虚拟环境
  9. windows检查磁盘命令
  10. 语音识别提取视频文案